在C++标准中哪里规定常量右值引用不绑定到左值?
Where in the C++ Standard is it stated that a const rvalue reference doesn't bind to an lvalue?
在C++标准中哪里声明常量右值引用不绑定到左值?
例如,下面的代码无法编译:
#include <iostream>
int i = 10;
int f(const int&& j) { return j; }
int main()
{
std::cout << f(i) << 'n';
}
在 [dcl.init.ref]/5 的最后一个项目符号中(引用 n3485):
如果
T1
[初始化引用的类型] 与T2
[初始值设定项表达式的类型] 相关,并且引用是右值引用, 初始值设定项表达式不应为左值。
在这种情况下,简历资格无关紧要。
/5 的第一个(主)项目符号不适用,因为引用不是左值引用:
如果引用是左值引用和初始值设定项表达式 [...]
第二个(主要)要点适用:
否则,引用应是非易失性常量类型的左值引用(即 cv1 应
const
),或者引用应为右值引用
[强调我的]
它的第一个子项目符号不适用,因为初始值设定项不是 xvalue 或函数 prvalue,并且没有类类型。
第二个子项目符号点是无条件的"否则",因此最后一个子项目符号点适用。
如果初始值设定项与引用的类型 (T1
) 无关,则示例将编译:
#include <iostream>
double i = 10;
int f(const int&& j) { return j; }
int main()
{
std::cout << f(i) << 'n';
}
现场示例
[C++11: 8.5.3/3]
列出了引用的初始化器是如何工作的;你要找的就在那里。不过,在这里逐字引用太详尽了。
相关文章:
- 我想将一个对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引用绑定创建的可修改的临时对象(和存储)