如果在C ++ 11中访问移动的对象,则发出警告

时间:2013-01-27 21:47:47

标签: c++ c++11 warnings move-semantics

  

可能重复:
  What can I do with a moved-from object?

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

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

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

  w.doSomething(); // WARN
}

至少,gcc 4.7.2clang 3.2-Wall不抱怨。

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

1 个答案:

答案 0 :(得分:14)

他们也不应该。移动的类的行为是你想要的。这不是编译器应警告的内容。

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

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

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