对象被移动后应重置状态再使用
2.10 ID_useAfterMove
对象被移动后在逻辑上不再有效,如果没有通过清空数据或重新初始化等方法更新对象的状态,不应再使用该对象。
示例:
#include <vector>
using V = std::vector<int>;
void foo(V& a, V& b)
{
a = std::move(b); // After moving, the state of ‘b’ is unspecified
b.push_back(0); // Non-compliant
}
例中容器 b 的数据被移动到容器 a,可能是通过交换的方法实现的,也可能是通过其他方法实现的,标准容器被移动后的状态在 C++ 标准中是未声明的,程序不应依赖未声明的状态。
应改为:
void foo(V& a, V& b)
{
a = std::move(b);
b.clear(); // Clear
b.push_back(0); // Compliant
}
相关
依据
ISO/IEC 14882:2011 17.6.5.15(1)-unspecified
ISO/IEC 14882:2017 20.5.5.15(1)-unspecified