将左值引用绑定到右值引用

Bind an lvalue reference to an rvalue reference?

本文关键字:引用 绑定      更新时间:2023-10-16

我已经尝试编译:

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是一个左值,因为它是一个命名对象的表达式,即使它具有类型"对int的右值引用"!注意不要将类型值类别混淆,这里:类型与对象相关,但值类别与expressions相关(即使这些表达式命名或以其他方式计算为某个对象)。

仔细想想,这些令人困惑的规则都非常巧妙地结合在一起:要使原始引用有效,对象的生存期必须延长,因此b的初始化是安全的。