Информация об изменениях

Сообщение Re[3]: конструктор перемещения для std::exception от 26.09.2018 12:06

Изменено 26.09.2018 12:09 rg45

Re[3]: конструктор перемещения для std::exception
Здравствуйте, B0FEE664, Вы писали:

BFE>Перемещающий конструктор удалён, но не явно:

BFE>
BFE>namespace std {
BFE>  class exception {
BFE>    public:
BFE>      exception() noexcept;
BFE>      exception(const exception&) noexcept;
BFE>      exception& operator=(const exception&) noexcept;
BFE>      virtual ~ exception();
BFE>      virtual const char* what() const noexcept;
BFE>  };
BFE>}
BFE>


Э нет, это не удален, это скрыт. В этом случае компилятор сгенерит перемещающий конструктор в производном классе и реализует его через копирующий конструктор базового.

А вот если удалить конструктор перемещения базового класса явно, а в производном классе оставить объявление перемещающего конструктора по умолчанию, то код для него сгенерен не будет и в тех местах, в которых ожидается перемещение, возникнет ощибка компиляции.
Re[3]: конструктор перемещения для std::exception
Здравствуйте, B0FEE664, Вы писали:

BFE>Перемещающий конструктор удалён, но не явно:

BFE>
BFE>namespace std {
BFE>  class exception {
BFE>    public:
BFE>      exception() noexcept;
BFE>      exception(const exception&) noexcept;
BFE>      exception& operator=(const exception&) noexcept;
BFE>      virtual ~ exception();
BFE>      virtual const char* what() const noexcept;
BFE>  };
BFE>}
BFE>


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

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