Следующий код не компилировать как с ССАГПЗ и Clang из - за копирования конструкции B
базового класса suboject внутри A
конструктора:
struct B{
B();
B(const B&) =delete;
};
struct A:B{
A():B(B()){} //=> error: use of deleted function...
};
Тем не менее, согласно [class.base.init]/7:
Список выражений или braced-init-list в mem-initializer используется для инициализации обозначенного подобъекта (или, в случае делегирующего конструктора, полного объекта класса) в соответствии с правилами инициализации [dcl.init] для прямая инициализация.
Таким образом, правило инициализации одинаково для членов или прямых баз. Для подобъекта-члена Gcc и Clang не используют конструктор удаленных копий:
struct A2:B{
B b;
A2():b(B()){} //=> OK the result object of B() is b
};
Разве это не ошибка компилятора Clang и Gcc? Не должен ли конструктор копирования B
быть исключен в A()
?
Интересно, что даже если gcc проверяет, правильно ли сформирована конструкция копии, он исключает этот вызов конструктора копирования, см. Сборку здесь.