这是一个挑剔的问题,主要由好奇心驱动。假设我们有以下几点:将一个文字常量赋值给右值引用时会发生什么?
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
是一个值。我们也预计xref
是可变的。我们进一步期望不变的字面值5
的值是不可修改的(在上面的代码片段的最后两行中有些迂腐)。
所以我的问题是,究竟是在这里发生了什么? C++如何知道不要修改常量字面量5
的值,但仍然保持xref
的足够标识以知道它已被赋值更改为10
。当它绑定到一个常量字面量时,是否在赋值为xref
时创建了一个新变量?这个问题从来没有出现在C++ 03中,因为只有const引用可以绑定到右值。
谢谢。这回答了我的问题以及我会遇到的每个后续问题。 – Klam
@Klam:Lightness工业公司的所有服务。 –