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

Сообщение Re[5]: Виртуальное наследование и возврат объекта от 11.11.2019 22:53

Изменено 11.11.2019 23:47 rg45

Re[5]: Виртуальное наследование и возврат объекта
Здравствуйте, _NN_, Вы писали:

_NN>Разве компилятор не должен брать конструкторы из класса FinalClass ?


Должен. Но фишка в том, что подобъект виртуального базового класса инициализируется только в most derived классе. Он не может быть проинициализирован в не most derived классе. Поэтому конструктор перемещения, объявленный в FinalClass не оказывает никакого влияния на удаленный конструктор перемещения класса Base. И тот отстается быть удаленным аж до самого FinalClassEx. А вместе с ним оказывается удаленным и конструктор перемещения класса FinalClassEx, если его не определить.
Re[5]: Виртуальное наследование и возврат объекта
Здравствуйте, _NN_, Вы писали:

_NN>Разве компилятор не должен брать конструкторы из класса FinalClass ?


Должен. Но фишка в том, что подобъект виртуального базового класса инициализируется только в most derived классе. Он не может быть проинициализирован в не most derived классе. Поэтому конструктор перемещения, объявленный в FinalClass не оказывает никакого влияния на удаленный конструктор перемещения класса Base. И тот отстается быть удаленным аж до самого FinalClassEx. А вместе с ним оказывается удаленным и конструктор перемещения класса FinalClassEx, если его не определить.

P.S. Вот смотри, все сказанное можно показать и на более простом примере конструктора по умолчанию:

http://coliru.stacked-crooked.com/a/6aa33ac18a60c579
struct Base {
    Base() = delete;
    explicit Base(int) {};
};

struct FinalClass : virtual Base {
    FinalClass() : Base(42) {}
};

struct FinalClassEx : FinalClass {
};

FinalClass fc; // Ok
FinalClassEx fcex; // error: use of deleted function 'FinalClassEx::FinalClassEx()'