带模板的构造函数不应与拷贝或移动构造函数混淆
5.1.15 ID_roughTemplateConstructor
带模板的构造函数不应与拷贝或移动构造函数混淆,存在带模板的构造函数时应明确声明拷贝和移动构造函数。
示例:
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&&);
....
};
相关
依据
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