编译器中的Std :: move保证

时间:2016-05-24 17:35:32

标签: c++ std

我最近在cppreference.com上浏览,我碰巧发现this page about std::move,这是我一无所知的功能。

在此页面中,明确指出

  

除非另有说明,否则全部   已移动的标准库对象处于有效但未指定的状态。

因此,在std::move之后,C ++标准并不能保证变量内容的任何内容。然而,困扰我的部分是"除非另有说明"。

我想知道的是GCC或Visual C ++等编译器是否对变量的内容提供了任何保证?在Visual Studio 2013中使用string进行的一些快速测试似乎表明在move操作后字符串始终为空。

1 个答案:

答案 0 :(得分:0)

嗯,当标准说明时,状态未定义,那么它没有定义。正如@LogicStuff所写,有些类型在被移出之后具有已定义的状态,例如: std::unique_ptr<>

所以保证是,国家是有效的。这意味着,可以安全地调用所有方法,但不能保证,它们可能会返回什么。大多数情况下,您只想在这些对象上调用析构函数。

另请注意,正如许多人在评论中所说,std::move()不会发生移动。 std::move()仅返回它作为右值引用获得的引用。移动构造函数和移动赋值运算符接受右值引用作为其参数并执行实际移动。

当您只查看其名称时,调用该函数std::move()似乎不是最理想的。看看它的用途,这个名字是完美的,因为它告诉读者,这次你需要,例如要调用的移动构造函数,而不是复制构造函数。