移动构造函数和移动赋值运算符不可抛出异常
7.11 ID_throwInMove
在移动过程中,对象的状态是不完整的,如果在中途抛出异常,对象将处于错误的状态。
示例:
struct A {
A();
A(A&& a) noexcept; // Compliant
....
};
struct B: A {
B();
B(B&& b): A(move(b)) {
if (cond) {
throw Exception(); // Non-compliant
}
....
}
};
例中 B 的移动构造函数抛出异常时,基类对象的数据已被转移,被移动的对象将处于错误的状态。