Сообщение Re[5]: Виртуальное наследование и возврат объекта от 11.11.2019 22:53
Изменено 12.11.2019 6:13 rg45
Re[5]: Виртуальное наследование и возврат объекта
Здравствуйте, _NN_, Вы писали:
_NN>Разве компилятор не должен брать конструкторы из класса FinalClass ?
Должен. Но фишка в том, что подобъект виртуального базового класса инициализируется только в most derived классе. Он не может быть проинициализирован в не most derived классе. Поэтому конструктор перемещения, объявленный в FinalClass не оказывает никакого влияния на удаленный конструктор перемещения класса Base. И тот отстается быть удаленным аж до самого FinalClassEx. А вместе с ним оказывается удаленным и конструктор перемещения класса FinalClassEx, если его не определить.
P.S. Вот смотри, все сказанное можно показать и на более простом примере конструктора по умолчанию:
http://coliru.stacked-crooked.com/a/6aa33ac18a60c579
_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()'
Re[5]: Виртуальное наследование и возврат объекта
Здравствуйте, _NN_, Вы писали:
_NN>Разве компилятор не должен брать конструкторы из класса FinalClass ?
Должен. Но фишка в том, что подобъект виртуального базового класса инициализируется только в most derived классе. Он не может быть проинициализирован в не most derived классе. Поэтому конструктор перемещения, объявленный в FinalClass не оказывает никакого влияния на удаленный конструктор перемещения класса Base. И тот отстается быть удаленным аж до самого FinalClassEx. А вместе с ним оказывается удаленным и конструктор перемещения класса FinalClassEx, если его не определить.
P.S. Вот смотри, все сказанное можно показать и на более простом примере конструктора по умолчанию:
http://coliru.stacked-crooked.com/a/57a7b3ffd941f41d
_NN>Разве компилятор не должен брать конструкторы из класса FinalClass ?
Должен. Но фишка в том, что подобъект виртуального базового класса инициализируется только в most derived классе. Он не может быть проинициализирован в не most derived классе. Поэтому конструктор перемещения, объявленный в FinalClass не оказывает никакого влияния на удаленный конструктор перемещения класса Base. И тот отстается быть удаленным аж до самого FinalClassEx. А вместе с ним оказывается удаленным и конструктор перемещения класса FinalClassEx, если его не определить.
P.S. Вот смотри, все сказанное можно показать и на более простом примере конструктора по умолчанию:
http://coliru.stacked-crooked.com/a/57a7b3ffd941f41d
struct Base {
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()'