383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
1 | ||||||
GCC returning reference to temporary02.11.2013, 23:53. Показов 4902. Ответов 19
Метки нет (Все метки)
Например вот так:
Я к тому, что возвращенное func2() значение уже является rvalue, зачем его еще кастовать к T&& ?
0
|
02.11.2013, 23:53 | |
Ответы с готовыми решениями:
19
Предупреждение: returning address of local variable or temporary Binding reference to a temporary Ошибка undefined reference в Eclipse (Winodows,C++,MinGW,GCC) Undefined reference to pow() почему в университете gcc такое выдает, а дома нет? |
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
02.11.2013, 23:56 [ТС] | 3 |
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2013, 00:06 [ТС] | 5 |
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
03.11.2013, 00:14 | 7 |
Вылазит потому что rvalue reference - эта та же ссылка, но только на rvalue. А возвращать ссылку на локальный объект функции - это создавать баг.
std::move роли не играет, так как тут он ничего не делает. А при нем варнинг исчезает только из-за усложнения кода для анализа (мало ли что может вернуть std::move).
1
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2013, 00:34 [ТС] | 8 |
RValue-reference, слышали такое?
Добавлено через 12 минут From cplusplus.com: Ну и на всякий случай: ISO/IEC 14882:2011 Draft: n3690
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
03.11.2013, 00:38 | 9 |
Можешь объяснить, к чему ты это привел? Тут написано, что такое rvalues и что move делает из rvalue rvalue-reference, которая тоже является rvalue, поскольку не имеет имени. Но это я и так знаю.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2013, 00:51 [ТС] | 10 |
Зачем "делать" из rvalue rvalue-reference? По-моему компилятор не должен выводить предупреждение в 10 строке.
std::move() делает из lvalue rvalue-reference. Поэтому и возник вопрос - почему если обернуть и так временный объект, возвращаемый func2() в move(), то варнинг исчезает. Может я в чем-то не прав, поправьте, пожалуйста.
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
03.11.2013, 01:11 | 11 |
Ты в move передаешь что? rvalue. Что делает move? Грубо говоря, он делает static_cast<int&&>. У нас получается rvalue reference, у которого нет имени. Значит это rvalue. Ты возвращаешь ссылку на rvalue - на временный объект, который будет уничтожен. Это баг.
0
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|||||||||||
03.11.2013, 01:28 [ТС] | 12 | ||||||||||
Хорошо, а что если так:
Я вижу, что вы выше писали, что rvalue-reference это та же ссылка, только на rvalue. Но она же предназначена как раз таки "давать имя" временным объектам. Ей даже можно присвоить литерал, и потом получить его адрес (адрес ЛИТЕРАЛА).
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
03.11.2013, 12:01 | 13 |
А ничего не изменилось. Чтобы все работало правильно, надо из func1 возвращать значение. Возврат rvalue reference - это редко когда нужно.
По сути мы подхватили ссылку в никуда. rvalue reference - это не магия, она не может спасти локальный объект от уничтожения. Можно, потому что она тут lvalue, а литерал prvalue. И никаких локальных объектов, уничтожающихся при выходе из области, тут нет, - время жизни ссылки здесь ровно такое же, как и объекта.
1
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2013, 13:11 [ТС] | 15 |
С большим трудом, до меня дошло, спасибо Но что значит вот это (со стандарта):
И что в случае возврата больших значений из функции? Мне, например, нужно часто возвращать из функции объекты типа string размером в несколько сотен мебибайт. Не лучше ли их переместить как XValue вместо возврата по значению? Иногда такую оптимизацию делает сам компилятор, когда может. Добавлено через 1 минуту В 10 строке: returning reference to temporary [-Wreturn-local-addr] return func2(); ^ он еще в названии темы написан
0
|
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
03.11.2013, 13:35 | 16 |
И они, конечно же, создаются на стеке. Для этого уже давно есть out-параметры и смарт-поинтеры, куда можно засунуть указатель на эту строку. Ну или move-конструктор, если строка — это единственное, что надо вернуть.
Rvalue reference как и временные объекты живут до окончания ближайшего вычисляемого выражения. Их нельзя сохранить куда-то самих по себе, чтобы они выжили до следующего выражения.
2
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2013, 13:48 [ТС] | 17 |
То есть, получается, для строк и типов, которые внутри хранят указатели на дин.память move-semantics оправдана, а для фундаментальных типов уже не работает, потому что они разрушатся?
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
03.11.2013, 13:57 | 18 |
Если хочешь до конца разобраться с rvalue reference, посмотри еще universal reference и perfect forwarding.
Это значит, что безымянная rvalue reference - это xvalue. И что может быть перемещение ресурсов, если возвращать, например, std::move(член класса); Ну тут компилятору очевидно, что это локальный объект, потому что это abs возвращает просто значение. Если не пользоваться динамической памятью, то как вариант стоит посмотреть на RVO и copy elision. Семантика перемещения оправдана, когда нужно уметь красть ресурсы или когда объект может быть только перемещаемым. Не совсем понял про разрушение фундаментальных типов.
1
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
03.11.2013, 15:08 [ТС] | 19 |
0
|
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
03.11.2013, 15:23 | 20 |
Move-семантика не работает для фундаментальных типов, потому что это типы-значения. Не типы-объекты. Вы никак не можете отличить один (int) 42 от другого (int) 42. И даже от (long) 42 не можете. И это никак не исправить. Поэтому переменным фундаментальных типов выдан такой особый статус.
1
|
03.11.2013, 15:23 | |
03.11.2013, 15:23 | |
Помогаю со студенческими работами здесь
20
GCC Сборка 32 разрядной версии GCC 64 разрядным GCC Ошибки underfined reference to parentClass::method и unerfined reference to vtable при линковке Insert into . returning Предложение Returning Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |