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

带模板的赋值运算符不应与拷贝或移动赋值运算符混淆

5.1.14 ID_roughTemplateAssignOperator
目录 › next › previous

带模板的赋值运算符不应与拷贝或移动赋值运算符混淆,存在带模板的赋值运算符时应明确声明拷贝和移动赋值运算符。

示例:

class A   // Non-compliant, missing copy and move assignment operators
{
    int* dat;   // Need deep copy

public:
    A();
   ~A();
    template <class T>
    A& operator = (const T& a) {   // Not a copy assignment operator
        return do_copy(a.dat);
    }
    template <class T>
    A& operator = (T&& a) {   // Not a move assignment operator
        return do_move(a.dat);
    }
};

void foo(A& x, A& y)
{
    x = y;   // Not a deep copy
}

设例中的类需要深拷贝,标准规定即使带模板的赋值运算符在功能上可以满足拷贝或移动赋值运算符的需求,也不能作为拷贝或移动赋值运算符,故其拷贝和移动赋值运算符仍然是默认的,无法完成深拷贝以及正确的数据移动。

应明确声明拷贝和移动赋值运算符:

class A   // Compliant
{
    ....
    A& operator = (const A&);
    A& operator = (A&&);
    ....
};

相关

ID_roughTemplateConstructor

依据

ISO/IEC 14882:2003 12.8(9) ISO/IEC 14882:2011 12.8(17) ISO/IEC 14882:2011 12.8(19)

参考

MISRA C++ 2008 14-5-3
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.