【发布时间】:2013-01-11 05:45:27
【问题描述】:
在您调用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 被接受,我希望编译器有更多选择(但前提是移动是破坏性的)。
【问题讨论】:
-
您确定它会导致未定义的行为吗?我的理解是该对象处于有效但未指定的状态,这可能不会导致 UB。
-
这不是 UB。不过,具体细节必须由您的班级记录。
-
@JesseGood:我不认为这是重复的。他似乎知道他能做什么,他只是想要一些诊断以确保他没有这样做。但在一般情况下,我认为这没有意义
-
“稍后访问移动的对象将导致未定义的行为” - 而且,正如其他人所说,这个假设是错误的,这反过来也是为什么一般关于访问已移动对象的警告没有意义,因为编译器本身不知道对象的哪些方法在移动后可以安全访问。
-
@PhilippClaßen:您要求提供工具支持。但是警告是错误的,因为编译器无法知道。使用从对象移动的不是先验错误。在大多数情况下,这甚至都没有错。这是合法的事情,编译器不应该警告它。
标签: c++ c++11 warnings move-semantics