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

带模板的构造函数不应与拷贝或移动构造函数混淆

5.1.15 ID_roughTemplateConstructor
目录 › next › previous

带模板的构造函数不应与拷贝或移动构造函数混淆,存在带模板的构造函数时应明确声明拷贝和移动构造函数。

示例:

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

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

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

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

应明确声明拷贝和移动构造函数:

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

相关

ID_roughTemplateAssignOperator

依据

ISO/IEC 14882:2003 12.8(2) ISO/IEC 14882:2011 12.8(2) ISO/IEC 14882:2011 12.8(3)

参考

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