相关疑难解决方法(0)

临时初始化和参考初始化

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

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
查看次数

标签 统计

c++ ×1

c++11 ×1

c++17 ×1

implicit-conversion ×1

language-lawyer ×1