在C++标准中哪里规定常量右值引用不绑定到左值?

Where in the C++ Standard is it stated that a const rvalue reference doesn't bind to an lvalue?

本文关键字:引用 绑定 常量 标准 C++      更新时间:2023-10-16

在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 的第一个(主)项目符号不适用,因为引用不是左值引用:

如果引用是左值引用和初始值设定项表达式 [...]

第二个(主要)要点适用:

否则,引用应是非易失性常量类型的左值引用(即 cv1const ),或者引用应为右值引用

[强调我的]

它的第一个子项目符号不适用,因为初始值设定项不是 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]列出了引用的初始化器是如何工作的;你要找的就在那里。不过,在这里逐字引用太详尽了。