相关疑难解决方法(0)

左值隐式转换的左值

我看到整个C++标准中许多地方使用的术语"左值到右值转换".据我所知,这种转换通常是隐含的.

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

在我第一次遇到这个术语之前,我曾经或多或少地对lvalues和rvalues进行了如下建模:"lvalues 总是能够充当rvalues,但另外还可以出现在左侧=和右侧&".

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

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

每当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 …
Run Code Online (Sandbox Code Playgroud)

c++ implicit-conversion lvalue-to-rvalue c++11

41
推荐指数
2
解决办法
1万
查看次数

临时初始化和参考初始化

我想了解如何引用初始化。例如,我们看一个典型的例子。

double val = 4.55;
const int &ref = val;
Run Code Online (Sandbox Code Playgroud)

我可以想到上面代码片段中发生的事情的两种可能性。

可能性1

通常的解释如下:

这里创建了一个带有值类型的临时(纯右值),然后将引用绑定到这个临时(纯右值)对象,而不是直接绑定到变量。发生这种情况是因为右侧变量的类型是,而左侧我们有一个引用。但是为了将引用绑定到变量,类型应该匹配。此外,临时纯右值的生命周期也得到了延长。int4refintvalvaldoubleint

可能性2

我认为还有另一种可能发生的情况,如下:

这里创建了一个具有值类型的临时(纯右值)。但由于需要一个左值并且当前我们有一个纯右值,因此临时物化开始,因此纯右值被转换为xvalue。然后引用绑定到这个具体化的 xvalue(因为 xvalue 也是泛左值) ,而不是直接绑定到变量。发生这种情况是因为右侧变量的类型是,而左侧我们有一个引用。但是为了将引用绑定到变量,类型应该匹配。此外,物化临时 xvalue 的生命周期也延长了。int4const int &refrefvalvaldoubleint

我的问题是:

  1. 根据C++11标准,以上解释哪一个是正确的。我愿意接受上述解释都不正确,在这种情况下,正确的解释是什么。
  2. 根据C++17标准,以上解释哪一个是正确的。我愿意接受上述解释都不正确,在这种情况下,正确的解释是什么。
  3. 我也很困惑上述两种可能性的第一步中的纯右值是否实际上是一个临时对象?或者 xvalue 是实际对象。我的意思是我们是否有 2 个临时对象,例如第一个由于“纯右值转换”而导致的第二个临时对象由于“纯右值到 xvalue”转换(临时物质化)而导致。或者我们是否只有一个临时值,这是由于“prvalue to xvalue”临时物化所致。

PS:我并不是在寻找解决这个问题的方法。例如,我知道我可以简单地写: const double …

c++ language-lawyer implicit-conversion c++11 c++17

2
推荐指数
1
解决办法
284
查看次数