我试图理解C++11中的lvalue和rvalue,所以我编写了一个测试代码:
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,因此它的生存期延长了。但是当我试图访问它的值时,就会发生错误。为什么?
发布于 2017-07-11 09:54:44
我认为
baz()的返回值是xvalue,因此它的生存期延长了。
首先,baz()返回的内容总是一个悬空的引用。
对于int&& baz() { return 10; },临时寿命是不扩展的。它是在函数内部构造的,当退出函数时,它将被销毁,然后baz()总是返回一个悬空引用。
不扩展绑定到
return语句中函数的返回值的临时值:它将在返回表达式的末尾立即销毁。这样的函数总是返回一个悬空引用。
那么对于int&& rr5 = baz();来说,rr5也是一个悬空的引用;对它的尊重会导致UB,任何事情都是可能的。
另一方面,如果您将baz()更改为按值返回,则一切都会正常;返回值将被复制,然后绑定到rr5,然后将临时值的生存期扩展到rr5的生存期。
活着
https://stackoverflow.com/questions/45031045
复制相似问题