Оператор присваивания по умолчанию проверяет самопредставление - PullRequest
3 голосов
/ 19 февраля 2020

Я хотел бы знать, проверяет ли реализация по умолчанию оператора присваивания самопредставление, и поэтому, какую из этих двух реализаций можно считать наиболее близкой к реализации по умолчанию:

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

У меня есть искал стандарт C ++, но единственное, что я могу найти, это это , но в этом нет ничего

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Оператор присваивания не проверяет самопредставление. Поэтому ваша вторая реализация наиболее близка к стандартной.

Я не вижу ни одного слова в стандарте о такой оптимизации, и было бы странно, если бы атрибуты моего класса не были назначены сгенерированным компилятором оператором в некоторых случаях. Представьте, что какое-то назначение атрибута определяется пользователем и выполняет какую-то необычную задачу Компилятор этого не знает, и IMO должен вызывать их, даже если я назначу объект себе.

3 голосов
/ 19 февраля 2020

Нет, реализации не проверяют на "себя":

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

Копия Оператор присваивания , часто называемый «оператором присваивания» , представляет собой особый случай оператора присваивания, в котором источник (правая сторона) и пункт назначения (левая сторона) принадлежат к одному классу. тип.

Это одна из специальных функций-членов, что означает, что версия по умолчанию автоматически генерируется компилятором, если программист не объявляет ее.

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

...