crossplatform.ru

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


  Ответ в Изменение значения возвращаемого из функции
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
lanz Дата 31.8.2017, 10:34
 
Цитата
А ты опустил байндинг аргумента оператора=

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

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

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

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

https://imgs.xkcd.com/comics/duty_calls.png
Алексей1153 Дата 31.8.2017, 7:34
  хех, нашли, о чём спорить
Гест Дата 30.8.2017, 19:40
 
Цитата(lanz @ 30.8.2017, 16:21) *
Цитата
Что он описал неверно?

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

А ты опустил байндинг аргумента оператора=
lanz Дата 30.8.2017, 16:21
 
Цитата
Что он описал неверно?

Пропустил превращение prvalue в xvalue, я же все описал.
Гест Дата 29.8.2017, 15:20
 
Цитата(lanz @ 4.6.2017, 1:26) *
Не совсем

Что он описал неверно?
lanz Дата 4.6.2017, 1:26
 
Цитата(Алексей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
Алексей1153 Дата 3.6.2017, 20:22
  "работает" это так

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

2) вызывается оператор = объекта S , присваивается значение "Wolrd"
3) (getStr() = "Wolrd") возвращает ссылку на S
4) S выводится в поток
Quester Дата 3.6.2017, 13:07
 
Цитата(Iron Bug @ 2.6.2017, 21:34) *
в том виде, как ты написал, это не работает.
если хочешь присваивать результат значению, возвзащаемому из функции, результат должен иметь тип lvalue, то есть, возвращаться по ссылке.
типичное применение возврата ссылки - operator[].

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

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

Спасибо за ответ!!!
Iron Bug Дата 2.6.2017, 21:34
  в том виде, как ты написал, это не работает.
если хочешь присваивать результат значению, возвращаемому из функции, результат должен иметь тип lvalue, то есть, возвращаться по ссылке.
типичное применение возврата ссылки - operator[].
Quester Дата 2.6.2017, 20:37
  Добрый вечер, ребята! Объясните пожалуйста, как такое работает:

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

int main(){

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


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

Спасибо!!!
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 16:43