crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Изменение значения возвращаемого из функции
Гость_Quester_*
сообщение 2.6.2017, 20:37
Сообщение #1





Гости








    


Добрый вечер, ребята! Объясните пожалуйста, как такое работает:

...
std::string getStr(){
   reutrn "hello";
}

int main(){

   getStr() = "World!";
...


Из функции "getStr()" вернется временная переменная, скажите пожалуйста, разве можно изменять значение временной переменной? И насколько это корректно??

Спасибо!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 2.6.2017, 21:34
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


в том виде, как ты написал, это не работает.
если хочешь присваивать результат значению, возвращаемому из функции, результат должен иметь тип lvalue, то есть, возвращаться по ссылке.
типичное применение возврата ссылки - operator[].
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Quester_*
сообщение 3.6.2017, 13:07
Сообщение #3





Гости








    


Цитата(Iron Bug @ 2.6.2017, 21:34) *
в том виде, как ты написал, это не работает.
если хочешь присваивать результат значению, возвзащаемому из функции, результат должен иметь тип lvalue, то есть, возвращаться по ссылке.
типичное применение возврата ссылки - operator[].

Если написать так, то работает-
...
cout<<(getStr() = "Wolrd");
...

, напишет "World". Просто не понятно, как компилируется, мы же rvalue значение присваиваем, а это нельзя вроде?

Спасибо за ответ!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.6.2017, 20:22
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


"работает" это так

1) getStr() возвращает объект класса std::string (безымянный, но назовём его, скажем, S). S содержит значение "hello"

2) вызывается оператор = объекта S , присваивается значение "Wolrd"
3) (getStr() = "Wolrd") возвращает ссылку на S
4) S выводится в поток
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.6.2017, 1:26
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата(Алексей1153 @ 3.6.2017, 20:22) *
"работает" это так

Не совсем :)
Вот так не скомпилируется:
int getInt() {
  return 42;
}

int main(int argc, char **argv) {
  getInt() = 15;
}


Цитата(Гость_Quester_* @ 3.6.2017, 13:07) *
мы же rvalue значение присваиваем, а это нельзя вроде?

Это верно, но не совсем, т.к. возвращается объект класса std::string, то assignment превращается в вызов member function и prvalue превращается в xvalue.
Называется temporary materialization.
http://en.cppreference.com/w/cpp/language/...materialization

Сообщение отредактировал lanz - 4.6.2017, 1:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гест_*
сообщение 29.8.2017, 15:20
Сообщение #6





Гости








    


Цитата(lanz @ 4.6.2017, 1:26) *
Не совсем

Что он описал неверно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 30.8.2017, 16:21
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Что он описал неверно?

Пропустил превращение prvalue в xvalue, я же все описал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гест_*
сообщение 30.8.2017, 19:40
Сообщение #8





Гости








    


Цитата(lanz @ 30.8.2017, 16:21) *
Цитата
Что он описал неверно?

Пропустил превращение prvalue в xvalue, я же все описал.

А ты опустил байндинг аргумента оператора=
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.8.2017, 7:34
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


хех, нашли, о чём спорить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 31.8.2017, 10:34
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
А ты опустил байндинг аргумента оператора=

this? он конвертируется в xvalue до байндинга, так что это тут не причем
"world"? а что необычного в байндинге const char* ?

Превращение prvalue в xvalue имеет непосредственное отношение к сути вопроса и объясняет механизм, поэтому я его и описал, байндинг аргументов не имеет к ней отношения. Если считаете обратное, разверните свою точку зрения более подробно.
Алексей1153 все в целом верно описал, кроме того что из функции возвращается не временное значение, а prvalue, о чем спрашивал ТС
Цитата
мы же rvalue значение присваиваем, а это нельзя вроде?

Поэтому я и посчитал возможным рассказать о механизме temporary materialization.

Цитата
хех, нашли, о чём спорить

https://imgs.xkcd.com/comics/duty_calls.png
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 15:31