Я пытался понять lvalue и rvalue в C ++ 11. Итак, я написал тестовый код:
int x = 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }
int main() {
int& lr1 = 10; // error: lvalue references rvalue
int& lr2 = x; // ok
int& lr3 = foo(); // error: lvalue references rvalue
int& lr4 = bar(); // ok
int& lr5 = baz(); // error: lvalue references rvalue
int&& rr1 = 10; // ok
int&& rr2 = x; // error: rvalue references lvalue
int&& rr3 = foo(); // ok
int&& rr4 = bar(); // error: rvalue references lvalue
int&& rr5 = baz(); // ok
}
Это работает довольно хорошо, поэтому я вставил std :: cout для печати результатов.
#include <iostream>
int x= 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }
int main() {
int& lr1 = 10; std::cout << lr1 << std::endl; // error
int& lr2 = x; std::cout << lr2 << std::endl; // ok
int& lr3 = foo(); std::cout << lr3 << std::endl; // error
int& lr4 = bar(); std::cout << lr4 << std::endl; // ok
int& lr5 = baz(); std::cout << lr5 << std::endl; // error
int&& rr1 = 10; std::cout << rr1 << std::endl; // ok
int&& rr2 = x; std::cout << rr2 << std::endl; // error
int&& rr3 = foo(); std::cout << rr3 << std::endl; // ok
int&& rr4 = bar(); std::cout << rr4 << std::endl; // error
int&& rr5 = baz(); std::cout << rr5 << std::endl; // ERROR!?
}
int&& rr5 = baz(); std::cout << rr5;
вызывает ошибку времени выполнения, но я не знаю, почему это делает ошибку.
Я думаю, что возвращаемое значение baz()
будет xvalue, поэтому его время жизни продлено. Но когда я пытался получить доступ к его значению, возникает ошибка. Зачем?
Я думаю, что возвращаемое значение
baz()
будет xvalue, поэтому его время жизни продлено.
Сначала что baz()
Возвращение — это всегда свисающая ссылка.
За int&& baz() { return 10; }
, время жизни временного не продлен. Он построен внутри функции и будет разрушен при выходе из функции, затем baz()
всегда возвращает висячую ссылку.
временная привязка к возвращаемому значению функции в
return
Оператор не расширен: он уничтожается сразу в конце выражения возврата. Такая функция всегда возвращает висячую ссылку.
Тогда для int&& rr5 = baz();
, rr5
это тоже свисающая ссылка; уважение к нему приводит к UB и все возможно.
С другой стороны, если вы измените baz()
для возврата по значению все будет хорошо; возвращаемое значение копируется и затем связывается с rr5
, тогда время жизни временного увеличивается до времени жизни rr5
,
Других решений пока нет …