左值隐式转换的左值

时间:2013-12-31 01:52:56

标签: c++ c++11 implicit-conversion lvalue-to-rvalue

我在整个C ++标准的许多地方都看到了“左值到左值转换”一词。据我所知,这种转换通常是隐含的。

标准中的一个意外(对我来说)特征是他们决定将左值作为转换处理。如果他们说glvalue总是可以接受而不是prvalue怎么办?这句话实际上会有不同的含义吗?例如,我们读到lvalues和xvalues是glvalues的例子。我们没有读到lvalues和xvalues可以转换为glvalues。意义上有区别吗?

在我第一次遇到这个术语之前,我曾经或多或少在心理上对左值和右值进行了如下建模:“左值总是能够充当右值,但另外还可以出现在左边=的一侧,以及&的右侧。

对我而言,这是一种直观的行为,如果我有一个变量名,那么我可以将该名称放在我想放置文字的地方。该模型似乎与标准中使用的左值到右值隐式转换术语一致,只要保证发生隐式转换即可。

但是,因为他们使用这个术语,我开始想知道在某些情况下是否可能无法进行隐式左值到右值转换。也就是说,也许我的心理模型在这里是错误的。以下是该标准的相关部分:(感谢评论者)。

  

每当glvalue出现在期望prvalue的上下文中时,glvalue就会转换为prvalue;见4.1,4.2和4.3。 [注意:尝试将rvalue引用绑定到左值不是这样的上下文;见8.5.3 .-结束注释]

我理解他们在说明中描述的内容如下:

int x = 1;
int && y = x; //in this declaration context, x won't bind to y.
// but the literal 1 would have bound, so this is one context where the implicit 
// lvalue to rvalue conversion did not happen.  
// The expression on right is an lvalue. if it had been a prvalue, it would have bound.
// Therefore, the lvalue to prvalue conversion did not happen (which is good). 

所以,我的问题是(是):

1)有人可以澄清这种转换可能隐含发生的背景吗?具体来说,除了绑定到右值引用的上下文之外,还有其他任何其中lvalue-to-rvalue转换无法隐式发生的情况吗?

2)此外,条款中的括号[Note:...]使我们可以从之前的句子中找出它。标准的哪一部分是什么?

3)这是否意味着rvalue-reference binding不是我们期望prvalue表达式的上下文(在右边)?

4)与其他转换一样,glvalue-to-prvalue转换是否涉及在运行时工作以允许我观察它?

我的目标不是要问是否允许这样的转换。我正在努力学习使用标准作为起点向自己解释此代码的行为。

一个好的答案将通过我上面的引用并解释(基于解析文本)其中的注释是否也隐含在其文本中。然后它可能会添加任何其他引号,让我知道其中这种转换可能无法隐式发生的其他上下文,或解释不再有这样的上下文。也许对glvalue到prvalue的原因的一般讨论被认为是转换。

1 个答案:

答案 0 :(得分:2)

关于glvalues:glvalue(“generalized”左值)是一个左值或x值的表达式。 可以使用左值到右值,数组到指针或函数到指针隐式转换将glvalue隐式转换为prvalue。

当lvalue参数(例如对象的引用)用于期望rvalue(例如数字)的上下文时,应用左值变换。

右值转换左值
任何非函数非数组类型T的glvalue都可以隐式转换为相同类型的prvalue 。如果T是非类类型,则此转换也会删除cv限定符。除非在未评估的上下文中遇到(在sizeof,typeid,noexcept或decltype的操作数中),否则此转换使用原始glvalue作为构造函数参数有效地复制构造类型为T的临时对象,并且该临时对象作为prvalue返回。如果glvalue的类型为std :: nullptr_t,则生成的prvalue为空指针常量nullptr。