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

移动赋值运算符的参数应为同类对象的非 const 右值引用

6.8.7 ID_nonStdMoveAssignmentParam
目录 › next › previous

移动赋值意在将参数的数据转移到当前对象中,故参数应为右值引用,且不应受 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)

参考

C++ Core Guidelines C.63
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.