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

Phi*_*ßen 16 c++ warnings move-semantics c++11

可能重复:
移动对象有什么用处?

在调用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被接受,我希望编译器有更多选项(但只有在移动是破坏性的时候).

Nic*_*las 15

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

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

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

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

  • 当然,这种用法应该是安全的,但您正在重新初始化对象 (operator=)。那么如果你调用了 `v.size()` 呢?我不知道它是否保证返回 0,所以我仍然认为在这里警告是个好主意。 (2认同)
  • `v.size()`不保证返回0,但返回容器的实际大小.在某些情况下,尝试移动可能会变成副本,而源可能会保持不变.例如,从`int`移动可能*不*使源具有零值. (2认同)

归档时间:

查看次数:

1440 次

最近记录:

7 年 前