2014-11-24 55 views
2

该标准是否对基本数据类型提供任何保证?该标准是否对基本类型的移动提供任何保证?

int i = 42; 
int j = std::move(i); 
// what can we say about i here? 

合理的选择是保持移动的值不变或将其设置为零?

很显然,上面的代码本身没什么意义,但是认为模板。

+0

未触动的工作量少,所以我会假设一个合理的实现将表现得好像它只是被复制一样。但我不知道标准实际上保证了什么。有趣的问题。 – Cameron 2014-11-24 22:45:46

+4

@Tobias你是什么意思的“保证”?在你的例子中,'std :: move'只是将类型改为右值引用,不涉及“物理”移动。如果左侧没有移动构造函数/赋值运算符,则该对象通过其复制构造函数复制(或仅分配给POD)。基本类型肯定没有移动语义。这是你所问的还是我误解你的问题? – vsoftco 2014-11-24 22:48:15

+0

@vsoftco哦,是的。当然...谢谢。 – 2014-11-24 22:51:23

回答

1

POD并不真正移动,他们复制(或者,他们的复制和移动是相同的操作,因为在这种情况下没有什么可以“移动”) - 请参阅here

+0

如果我正确理解了vsoftco(上面)的评论,那么“移动”只是说“复制”的一种奇特方式,实际上并没有做任何事情。在这方面,我不明白你的“小调优”言论。你能详细说明一下吗? – 2014-11-24 22:57:55

+0

@TobiasBrüll通过阅读互联网上的其他一些例子,我开始相信,在这种情况下,编译器可能实际上决定使用相同的内存地址来存储两个值。但你是对的,那是不正确的。现在更改答案。谢谢! – 2014-11-24 23:00:38

+1

@martin_pr它可能在 – 2014-11-25 00:14:26

2

内置=运算符,如a = b使用时,已充分证明长期的阅读b的价值的行为,并将其存储在a。标准中没有任何内容表明整数赋值会修改赋值RHS。

5.17分配和复合赋值运算符[expr.ass]

...

2在简单赋值(=),则表达式的值替换的对象称为由左操作数。

没有关于更改任何其他对象的任何值的说法,所以其他对象的值不得更改。

重载自定义operator=实现的行为可能会有所不同,并且许多标准库类型实际上会使其行为不同,但不影响为该语言的内置=运算符提供的保证。

+1

的as if规则下。但是,问题是关于移动语义及其在模板化代码中的使用(其中std :: move可能在POD上使用)。赋值运算符是相关的,但我相信问题不在于此。此外,我不相信你的答案在一般情况下是正确的 - 例如,std :: auto_ptr并不遵循你的结论(尽管所有的POD都这样做)。 – 2014-11-24 22:52:54

+1

@martin_pr'std :: move'从来没有任何类型的副作用。它只是返回它的论点。 – hvd 2014-11-24 22:54:05

+0

@martin_pr至于'auto_ptr',我特别提到操作符可以重载,重载操作符的行为可能会有所不同。这个问题询问基本类型。我回答了基本类型。 (要明确,“基本类型”具有特定含义,标准库类型不一定是基本类型。) – hvd 2014-11-24 22:54:48

相关问题