抽象类禁用拷贝和移动赋值运算符
5.1.16 ID_unsuitableAssignOperator
抽象类只能作为基类,没有独立的对象,调用拷贝或移动赋值运算符会造成数据不完整。
示例:
struct A {
virtual ~A() = 0;
A& operator = (const A&); // Non-compliant
A& operator = (A&&); // Non-compliant
....
};
void foo(A& x, A& y) {
x = y; // Incomplete assignment
}
例中 foo 函数的参数只能是 A 的派生类对象,派生类对象调用基类的拷贝赋值运算符会得到不完整的复制结果。
应改为:
struct A {
virtual ~A() = 0;
A& operator = (const A&) = delete; // Compliant
A& operator = (A&&) = delete; // Compliant
....
};
将抽象类的拷贝和移动赋值运算符设为 =delete 或 private,可在编译期阻止不完整的复制和移动。
参考
C++ Core Guidelines C.67
MISRA C++ 2008 12-8-2