17

可能重复:
我可以对移出的对象做什么?

在您调用std::move并将结果传递给函数之后,您通常必须假设稍后访问移动的对象将导致未定义的行为。

是否有工具可以检测这些访问并警告您。例如:

{
  Widget w;
  foo(std::move(w));
  // w may be undefined at this point

  w.doSomething(); // WARN
}

至少,并gcc 4.7.2没有抱怨。clang 3.2-Wall

更新:回顾这个问题,关键点是编译器无法确定一个对象在被移动后是否仍然有效。如果提案N4034: Destructive Move被接受,我希望编译器有更多的选择(但前提是移动是破坏性的)。

4

1 回答 1

15

他们也不应该。搬出班级的行为是你想要的。这不是编译器应该警告的事情。

对于标准库对象,移出的类处于“有效但未指定的状态”。因此,这样做是完全合法的:

std::vector<int> v{20, 30, 40};
std::vector<int> v2 = std::move(v);
v = std::vector<int>{50, 60, 70, 80};

clear不在乎向量的当前状态是什么;它只是清除向量。因此,它被重置为已知状态。同样,operator=不关心当前状态是什么;它会将其重置为已知状态。

于 2013-01-27T21:56:22.077 回答