【发布时间】:2016-01-10 04:59:27
【问题描述】:
这无疑是一个挑剔的问题,主要是出于好奇。假设我们有以下内容:
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::move 将x 转换为一个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 是prvalue。我们还期望xref 是可变的。我们进一步期望常量字面量5 的值是不可修改的(如上面sn-p 的最后两行所示有点迂腐)。
所以我的问题是,这里到底发生了什么? C++ 如何知道不修改常量文字 5 的值,但仍为 xref 保持足够的标识,以知道它已通过赋值更改为 10。当绑定到常量文字时,是否在分配给 xref 时创建了一个新变量?这个问题在 C++03 中从未出现过,因为只有 const 引用可以绑定到右值。
【问题讨论】:
标签: c++ move-semantics