将左值引用绑定到右值引用
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
是一个左值,因为它是一个命名对象的表达式,即使它具有类型"对int
的右值引用"!注意不要将类型与值类别混淆,这里:类型与对象相关,但值类别与expressions相关(即使这些表达式命名或以其他方式计算为某个对象)。
仔细想想,这些令人困惑的规则都非常巧妙地结合在一起:要使原始引用有效,对象的生存期必须延长,因此b
的初始化是安全的。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 模板允许左值与右值引用绑定
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 将引用绑定到指针的语法是什么?(各种)
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 为什么 VS 无法将右值引用绑定到指针?
- 出于什么原因,有必要将常量左值引用绑定到右值?
- 为什么此右值引用绑定到左值?
- 使用“void*”将右值引用绑定到左值
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 无法将类型为"类名 &"的非常量左值引用绑定到类型为"类名"的右值
- 引用绑定和复制构造函数/移动构造函数
- 将引用绑定到类型的值会删除限定符 MULTISET
- 无法将类型"int&"的非常量左值引用绑定到类型为"int"的右值
- 多态变体,并将一种类型的引用绑定到另一种类型的引用
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)