绑定 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&& 类型的左值表达式的主要内容,如果未能解决你的问题,请参考以下文章