Оператор присваивания - Самозадание

Предоставляет ли компилятор сгенерированный оператор назначения против самоопределения?

class T {

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

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

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

Ответ 1

Предоставляет ли компилятор сгенерированный оператор назначения против самоопределения?

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

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

Нет, нет, если все ваши атрибуты класса (и, следовательно, их) являются POD-types.

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

Ответ 2

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

#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;
}

Ответ 3

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