[英]Bind an lvalue reference to an rvalue reference?
我试图编译:
int &&a=3;
int &b=a;
而且有效。 我知道“ a”是左值,但是为什么我可以将“对int的右值引用”绑定到“对int的左值引用(而不是对int的右值引用)”? 这样,我可以更改临时值3:
b=5 //changing the value of the temporary bound to the rvalue reference
该技术是从std :: forward使用的,所以我认为它是标准行为。 对int的右值引用是否被视为存储临时值的简单int左值? 如果没有,您如何解释绑定?
引用不绑定到其他引用。 它们绑定到对象。
当您从3
初始化a
时,会创建一个新的临时int
对象, 其寿命会延长 。 b
只是对该对象的另一个引用。
请注意, a
是一个左值,因为它是一个命名对象的表达式,即使它的类型为 “ rvalue-reference to int
”! 注意不要将类型与值类别混淆,这里:类型与对象有关,但值类别与表达式有关 (即使这些表达式命名或以其他方式对某个对象求值)。
这些令人困惑的规则在您考虑时都非常整齐地融合在一起:为了使原始引用有效,必须延长对象的生存期,因此b
的初始化是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.