默认赋值运算符检查自赋值

Alb*_*lia 7 c++ standards operators

我想知道赋值运算符的默认实现是否检查自赋值,因此这两个实现中哪一个可以被认为最接近默认实现:

class A{
    int x;
public :
    ...
    // first one
    A& operator=(const A& a){
        if(this != &a) x = a.x;
        return *this;
    }
    // second one
    A& operator=(const A& a){
        x = a.x;
        return *this;
    }
}
Run Code Online (Sandbox Code Playgroud)

我搜索过 C++ 标准,但我能找到的唯一一个就是这个,但是没有任何关于这个的内容

pau*_*sm4 5

不,实现不检查“self”:

https://en.wikipedia.org/wiki/Assignment_operator_(C%2B%2B)

复制赋值运算符通常简称为“赋值运算符”,是赋值运算符的一种特殊情况,其中源(右侧)和目标(左侧)属于相同的类类型。

它是特殊成员函数之一,这意味着如果程序员没有声明它,编译器会自动生成它的默认版本。

默认版本执行成员复制,其中每个成员由其自己的复制赋值运算符(也可以是程序员声明的或编译器生成的)复制。

  • 该描述并不排除默认生成的实现执行自分配检查的可能性。标准并没有阻止它。唯一确定的方法是实际查看编译器生成的代码。 (2认同)
  • @RemyLebeau 标准说,“非联合类 X 的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动赋值。” 这如何允许实现检查自分配? (2认同)