Изменение значения возвращаемого из функции |
Здравствуйте, гость ( Вход | Регистрация )
Изменение значения возвращаемого из функции |
Гость_Quester_* |
2.6.2017, 20:37
Сообщение
#1
|
Гости |
Добрый вечер, ребята! Объясните пожалуйста, как такое работает:
Из функции "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
|
Гости |
в том виде, как ты написал, это не работает. если хочешь присваивать результат значению, возвзащаемому из функции, результат должен иметь тип lvalue, то есть, возвращаться по ссылке. типичное применение возврата ссылки - operator[]. Если написать так, то работает-
, напишет "World". Просто не понятно, как компилируется, мы же rvalue значение присваиваем, а это нельзя вроде? Спасибо за ответ!!! |
|
|
Алексей1153 |
3.6.2017, 20:22
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 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 |
"работает" это так Не совсем Вот так не скомпилируется:
мы же 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 |
30.8.2017, 16:21
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата Что он описал неверно? Пропустил превращение prvalue в xvalue, я же все описал. |
|
|
Гость_Гест_* |
30.8.2017, 19:40
Сообщение
#8
|
Гости |
|
|
|
Алексей1153 |
31.8.2017, 7:34
Сообщение
#9
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 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 |
|
|
Текстовая версия | Сейчас: 22.11.2024, 6:55 |