在调用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被接受,我希望编译器有更多选项(但只有在移动具有破坏性的情况下)。
答案 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=
并不关心当前的状态;它会将其重置为已知状态。