该标准是否准确地定义了一旦对象被移出,我可以对其执行的操作?我曾经认为,对于一个移出的对象,你所能做的就是销毁它,但这是不够的。
例如,以标准库中定义的函数模板swap为例:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}显然,必须可以将其赋值给移出对象,否则第2行和第3行将失败。那么,我还能用moved-from对象做什么呢?我可以在标准中的哪里找到这些详细信息?
(顺便问一下,为什么在第一行中是T c = std::move(a);而不是T c(std::move(a));?)
发布于 2011-08-11 22:30:46
Moved-from对象处于未指定但有效的状态。这表明,虽然对象可能不再能够做太多事情,但它的所有成员函数仍然应该表现出定义的行为-包括operator= -以及处于定义状态的所有成员,并且它仍然需要销毁。标准没有给出具体的定义,因为它对于每个UDT都是唯一的,但您可以找到标准类型的规范。一些容器是相对明显的-它们只是移动它们的内容,一个空的容器是一种定义良好的有效状态。基元不会修改移出对象。
附注:我相信它是T c = std::move(a)的,所以如果move构造函数(如果没有提供move,则是复制构造函数)是显式的,函数将会失败。
发布于 2011-08-11 23:09:58
17.6.5.15 lib.types.movedfrom
在C++标准库中定义的类型的
对象可以从(12.8)中移出。移动操作可以显式指定或隐式生成。除非另有说明,否则此类移出对象应处于有效但未指定的状态。
当对象处于未指定状态时,您可以对该对象执行任何没有前置条件的操作。如果存在要执行的带有前提条件的操作,则不能直接执行该操作,因为您不知道对象的未指定状态是否满足前提条件。
通常没有前置条件的操作示例:
get、empty、size通常有前提条件的操作示例:
这个答案现在以视频格式出现在这里:http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
https://stackoverflow.com/questions/7027523
复制相似问题