带模板的赋值运算符不应与拷贝或移动赋值运算符混淆
5.1.14 ID_roughTemplateAssignOperator
带模板的赋值运算符不应与拷贝或移动赋值运算符混淆,存在带模板的赋值运算符时应明确声明拷贝和移动赋值运算符。
示例:
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&&);
....
};
相关
依据
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