Оператор присваивания-Self-assignment

защищает ли сгенерированный компилятором оператор присваивания от самостоятельного присвоения?

class T {

   int x;
public:
   T(int X = 0): x(X) {}
};

int main()
{
   T a(1);
   a = a;
}

всегда ли мне нужно защищать от самостоятельного назначения, даже если члены класса не имеют типа указателя?

3 ответов


защищает ли сгенерированный компилятором оператор присваивания от самостоятельного присвоения?

нет, это не так. Он просто выполняет копию члена, где каждый член копируется своим собственным оператором присваивания (который также может быть объявлен программистом или сгенерирован компилятором).

всегда ли мне нужно защищать от самостоятельного назначения, даже если члены класса не имеют типа указателя?

нет, вы не если все атрибуты класса (и, следовательно, их)Pod-типов.

при написании собственных операторов присваивания вы можете проверить самоназначение, если хотите в будущем доказать свой класс, даже если они не содержат никаких указателей,и так далее. Также рассмотрим идиома копирования и замены.


Это легко проверить эмпирически:

#include <iostream>
struct A {
  void operator=(const A& rhs) {
    if(this==&rhs) std::cout << "Self-assigned\n";
  }
};

struct B {
  A a;
};

int main()
{
  B b;
  b = b;
}

class T {
    int x;
public:
    T(int X = 0): x(X) {}
// prevent copying
private:
    T& operator=(const T&);
};