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

Warn if accessing moved object in C++11

本文关键字:警告 对象 C++11 访问 移动 如果      更新时间:2023-10-16

可能的重复项:
我能对移出对象执行哪些操作?

调用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:破坏性移动被接受,我希望编译器有更多选择(但前提是移动是破坏性的)。

他们也不应该。移自类的行为是您想要的任何行为。这不是编译器应该警告的事情。

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

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

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