如果在 C++11 中访问移动的对象,则发出警告
Warn if accessing moved object in C++11
可能的重复项:
我能对移出对象执行哪些操作?
调用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:破坏性移动被接受,我希望编译器有更多选择(但前提是移动是破坏性的)。
他们也不应该。移自类的行为是您想要的任何行为。这不是编译器应该警告的事情。
对于标准库对象,移自类处于"有效但未指定的状态"。因此,这样做是完全合法的:
std::vector<int> v{20, 30, 40};
std::vector<int> v2 = std::move(v);
v = std::vector<int>{50, 60, 70, 80};
clear
不在乎向量的当前状态是什么;它只是清除向量。因此,它被重置为已知状态。同样,operator=
不在乎当前状态是什么;它会将其重置为已知状态。
相关文章:
- 当我调用它来解码 Blob 对象中的 png 图像时,"Magick++::readImages"引发警告
- 为什么 Clang 警告未使用的指针和未使用的基元,而不是未使用的对象?
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 警告被视为错误 - 未生成"对象"文件
- 如果对象在同一层次结构中,-Wreturn-std-move clang 警告是否正确
- 我不想导出的函数的未记录代码对象警告
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 模板类型推导警告返回对本地临时对象的引用
- 带有 -O3 警告的特征:参数 1 值 'X' 超过最大对象大小 Y
- 为什么当对象std ::向量被声明但从未使用时,编译器不会发出警告
- 当从此到子类中的新对象时,将显示警告"destination for this 'memcpy' call is a pointer to dynamic class..."
- 将 NULL 作为对象返回时未收到任何警告
- 警告LNK4206:找不到预编译类型信息; 未链接或覆盖;链接对象,就好像没有调试信息一样
- 错误 C2220:警告被视为错误 - 未生成"对象"文件
- 在c++中,对象可以警告类它已经发生了变化吗?
- 返回对象的const副本时发出警告
- 共享公共对象 - 警告"defined but not used"
- 强制c++编译器对一个对象的所有堆栈实例发出警告
- 包含不可复制对象的对象的编译警告是不可读的
- 如果在 C++11 中访问移动的对象,则发出警告