Порядок вызова оператора назначения базовых ходов - PullRequest
1 голос
/ 26 марта 2020

Какое правильное место для вызова оператора присваивания базового класса из производного класса, в качестве первого или последнего оператора, перед оператором возврата?

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

Class Base {
    // Members goes here

public:
    Base &operator=(Base &&o) {
        // move all the members specific to the class here
        return *this;
    }
};

class Derived {
    // Members goes here

public:
    Derived &operator=(Derived &&o) {
      // Is this correct? Base class move here or below?
      Base::operator=(std::move(o));  // Is this the correct place??

      // move all the members specific to the class here

      // The assumption is that once we use move we cannot use the variable.
      // So, should I have base class move call here?
      // Base::operator(std::move(o));  // Or is this the correct place??
      return *this;
    }
};

1 Ответ

1 голос
/ 26 марта 2020

Все, что подходит для вашей семанти c. Как правило, правильное назначение перемещения по умолчанию:

Derived &operator=(Derived &&o) = default;

Реализация по умолчанию будет начинаться с базы.

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

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

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