我试过编译:
int &&a=3;
int &b=a;
并且有效。 我知道“a”是左值,但为什么我可以将“对 int 的右值引用”绑定(bind)到“对 int 的左值引用(而不是对 int 的右值引用)”? 这样,我可以更改临时值 3:
b=5 //changing the value of the temporary bound to the rvalue reference
这个技术是从 std::forward 使用的,所以我想这是一个标准行为。 对 int 的右值引用是否被视为存储临时值的简单 int 左值? 如果不是,您如何解释绑定(bind)?
最佳答案
引用不绑定(bind)到其他引用;它们绑定(bind)到对象。
当您从3
初始化a
时,您创建了一个新的临时int
对象whose lifetime is extended . b
只是对该对象的另一个引用。
请注意,a
是一个左值,因为它是一个命名对象的表达式,即使它具有类型“右值引用” 整数
”!注意不要将类型与值类别混淆,这里:类型与对象相关,但值类别与表达式相关(即使这些表达式名称或以其他方式评估某个对象)。
当您考虑时,这些令人困惑的规则都非常巧妙地组合在一起:要使原始引用有效,对象的生命周期必须已经延长,因此 b
的初始化是安全的。
关于c++ - 将左值引用绑定(bind)到右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705797/