☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

抽象类禁用拷贝和移动赋值运算符

5.1.16 ID_unsuitableAssignOperator
目录 › next › previous

抽象类只能作为基类,没有独立的对象,调用拷贝或移动赋值运算符会造成数据不完整。

示例:

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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.