移动赋值运算符的参数应为同类对象的非 const 右值引用
6.8.7 ID_nonStdMoveAssignmentParam
移动赋值意在将参数的数据转移到当前对象中,故参数应为右值引用,且不应受 const 关键字限制。
示例:
class A {
char* p;
public:
A& operator = (const A&& a) { // Non-compliant
free(p);
p = copy(a.p); // Not necessary
return *this;
}
....
};
例中赋值运算符先释放持有的资源,再复制 a 的资源,不是真正的移动赋值,仍是一种低效实现。应将 a.p 与 this->p 交换,省去复制过程,并使原有资源由 a 的析构函数释放,才是真正意义上的移动赋值:
A& A::operator = (A&& a) { // Compliant
char* tmp = p;
p = a.p;
a.p = tmp;
return *this;
}
依据
ISO/IEC 14882:2011 12.8(19)
ISO/IEC 14882:2017 15.8.2(3)