标准是否准确定义了对象移动后我可以对其做什么?我曾经认为你用移动物体做的所有事情都可以破坏它,但这还不够.
例如,采用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!
}
Run Code Online (Sandbox Code Playgroud)
显然,必须可以分配给移动的对象,否则第2行和第3行将失败.那么移动对象我还能做些什么呢?我在哪里可以找到标准中的这些细节?
(顺便说一句,为什么它T c = std::move(a);不是T c(std::move(a));第1行呢?)
可能重复:
移动对象有什么用处?
在调用std::move并将结果传递给函数之后,通常必须假定稍后访问移动的对象将导致未定义的行为.
是否有工具可以检测这些访问并警告您.例如:
{
Widget w;
foo(std::move(w));
// w may be undefined at this point
w.doSomething(); // WARN
}
Run Code Online (Sandbox Code Playgroud)
至少,gcc 4.7.2并且clang 3.2与-Wall不抱怨.
更新:回顾这个问题,关键点是编译器无法确定对象在移动后是否仍然有效.如果提议N4034:Destructive Move被接受,我希望编译器有更多选项(但只有在移动是破坏性的时候).