2015-10-12 34 views
6

这是一个挑剔的问题,主要由好奇心驱动。假设我们有以下几点:将一个文字常量赋值给右值引用时会发生什么?

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引用可以绑定到右值。

回答

4

构造一个临时文本,从文本的值开始初始化,并且它的持续时间与引用一样长。你可以用这个对象做你喜欢的事情。

就寿命而言,这与您写作const int& x = 5的效果相同;只有在那里,您正在使用自动创建的临时对象的事实被屏蔽,因为const阻止您使用突变来证明它。

[C++14: 8.5.3/5]:[..]如果T1是一种非类类型,临时型“CV1T1”被创建和复制初始化(8.5)从初始化表达的。然后参考文件被绑定到临时文件。 [..]

+1

谢谢。这回答了我的问题以及我会遇到的每个后续问题。 – Klam

+0

@Klam:Lightness工业公司的所有服务。 –

5
int&& xref = 5; 

...创建临时,用5,其寿命延长到该块的结束初始化。

分配

xref = 10; 

改变仍住临时的价值。

相关问题