绑定 T&& 类型的左值表达式

Posted

技术标签:

【中文标题】绑定 T&& 类型的左值表达式【英文标题】:binding a lvalue expression of type T&& 【发布时间】:2013-09-15 19:40:21 【问题描述】:

在过去的几天里,我一直试图掌握左值/右值引用背后的一个看似微不足道的原则。让我们定义一个新的右值引用:

int&& x = 12;

x 因此是int&& 类型的左值表达式。由于x 是一个左值,它可以绑定到相同类型的左值引用,即int&& 类型的左值引用。这样的左值引用将被定义为:

int&& & ref_x = x; // non-working code, just for the sake of explanation

当然,不能显式定义一个引用到一个引用,正确的绑定方式如下:

int& ref_x = x;

C++ Primer 报告了以下关于使用引用作为初始值设定项的内容:

当我们使用引用作为初始化器时,我们实际上是在使用 引用绑定的对象

另一方面,左值引用必须与左值表达式的类型相匹配。我错过了什么?这种情况下是否涉及到引用折叠?

谢谢。

【问题讨论】:

【参考方案1】:

不,x(作为表达式)是 int 类型的表达式。表达式值的类型永远不是引用。事实上,x 也是一个左值,因为它是一个命名的东西。

此外,没有对引用的引用,原因相同:引用绑定到值,而值永远不是引用。

如果您感到困惑,请不断告诉自己:表达式的值始终是对象类型。表达式的值 category 是 l 还是 r 只决定了该值可以绑定到什么样的事物上;它对其类型没有影响。

【讨论】:

Scott Meyer 的“C++11 中的通用引用”文章中的以下语句怎么样:“因为表达式的左值或右值与其类型无关,所以可能有左值其类型是右值引用,也可以有右值引用类型的右值”? [expr]/5 "如果表达式最初的类型为“引用T”,则在进行任何进一步分析之前,该类型将调整为T。" (至少这是第一步) 不,static_cast<int&>(x) 的结果仍然只是int。谁有那个文章的链接方便? name 可以具有类型右值引用,这样decltype(a) 就是int &&,但这是decltype 的特例。表达式a 仍然是int 类型的左值,因此带有更多括号的decltype((a))int & @DyP 请参阅 5.2.9/1 和 5/5,它们禁止表达式具有引用类型。 @DyP 这不是“初始”的含义,但其他人也对此感到困惑,以及“在进一步分析之前”。它是这样的:语法结构static_cast<…>(…) 是一个子表达式。在识别它的类型时,如果你到达了一个引用类型,就去掉这个引用。

以上是关于绑定 T&& 类型的左值表达式的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到的表达式必须是可修改的左值?

左值的详解

对纯右值的左值引用的地址代表啥?

从4行代码看右值引用

为啥我不能将 const 左值引用绑定到返回 T&& 的函数?

❥关于C++之右值引用&移动语义┇移动构造&移动复制