为什么绑定到 xvalue 的右值引用在我的代码中不起作用?
Why rvalue reference binding to xvalue doesn't work in my code?
我试图理解 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()
的 return 值将是 xvalue,因此它的生命周期会延长。但是当我试图访问它的值时,错误发生了。为什么?
I think the return value of baz()
would be xvalue, so its lifetime is prolonged.
起初 baz()
returns 总是一个悬空引用。
对于int&& baz() { return 10; }
,lifetime of the temporary没有扩展。它是在函数内部构造的,当退出函数时会被销毁,那么 baz()
总是 return 是一个悬空引用。
a temporary bound to a return value of a function in a return
statement is not extended: it is destroyed immediately at the end of the return expression. Such function always returns a dangling reference.
那么对于int&& rr5 = baz();
,rr5
也是一个悬空引用;对它的尊重导致 UB 一切皆有可能。
另一方面,如果将 baz()
更改为 return-by-value,一切都会好起来的; return 值被复制然后绑定到 rr5
,然后临时的生命周期被延长到 rr5
.
的生命周期
我试图理解 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()
的 return 值将是 xvalue,因此它的生命周期会延长。但是当我试图访问它的值时,错误发生了。为什么?
I think the return value of
baz()
would be xvalue, so its lifetime is prolonged.
起初 baz()
returns 总是一个悬空引用。
对于int&& baz() { return 10; }
,lifetime of the temporary没有扩展。它是在函数内部构造的,当退出函数时会被销毁,那么 baz()
总是 return 是一个悬空引用。
a temporary bound to a return value of a function in a
return
statement is not extended: it is destroyed immediately at the end of the return expression. Such function always returns a dangling reference.
那么对于int&& rr5 = baz();
,rr5
也是一个悬空引用;对它的尊重导致 UB 一切皆有可能。
另一方面,如果将 baz()
更改为 return-by-value,一切都会好起来的; return 值被复制然后绑定到 rr5
,然后临时的生命周期被延长到 rr5
.