当您将文字常量分配给右值引用时会发生什么?

What happens when you assign a literal constant to an rvalue reference?

诚然,这是一个挑剔的问题,主要是出于好奇。假设我们有以下内容:

int x = 5;
int&& xref = std::move(x);
std::cout << "Before assignment x: " << x << std::endl;
std::cout << "Before assignment xref: " << xref << std::endl;
xref = 10;
std::cout << "After assignment x: " << x << std::endl;
std::cout << "After assignment xref: " << xref << std::endl;

预期的输出是:

// Before assignment x: 5
// Before assignment xref: 5
// After assignment x: 10
// After assignment xref: 10

这是有道理的。 std::movex 转换为一个 xvalue 并允许我们将其内存位置绑定到 xref 并相应地修改其内容。现在假设我们有以下内容:

int&& xref = 5;
std::cout << "Before assignment xref: " << xref << std::endl;
xref = 10;
std::cout << "After assignment xref: " << xref << std::endl;

int x = 5;
std::cout << "After assignment x: " << x << std::endl;

直观的输出是:

// Before assignment xref: 5
// After assignment xref: 10
// After assignment x: 5

这在整体上是有道理的。我们希望能够将常量文字 5 绑定到 xref,因为 5 是纯右值。我们还希望 xref 是可变的。我们进一步期望常量文字 5 的值是不可修改的(如上面代码片段的最后两行中有些迂腐地显示的那样)。

所以我的问题是,这里到底发生了什么? C++ 如何知道不修改常量文字 5 的值,同时保持足够的身份让 xref 知道它已被赋值更改为 10。当绑定到常量文字时,是否在分配给 xref 时创建了一个新变量?这个问题在 C++03 中从未出现过,因为只有 const 引用可以绑定到右值。

构造了一个临时变量,从文字的值初始化,它的持续时间与引用一样长。你可以用这个对象做你喜欢的事。

就生命周期而言,这与您编写的 const int& x = 5 相同;只有在那里,你正在使用一个自动创建的临时对象的事实被掩盖了,因为 const 阻止你用突变来证明它。

[C++14: 8.5.3/5]: [..] If T1 is a non-class type, a temporary of type “cv1 T1” is created and copy-initialized (8.5) from the initializer expression. The reference is then bound to the temporary. [..]

int&& xref = 5;

...创建一个临时的,初始化为5,其生命周期延长到块的末尾。

作业

xref = 10;

更改仍然存在的临时值。