Ответ 1
Это дефект в стандартной редакции. Исключение копирования не может быть гарантировано при инициализации подобъекта базового класса, поскольку базовые классы могут иметь разную компоновку, чем соответствующий полный тип объекта.
Почему конструктор перемещения для Base
является обязательным в случае наследования (class B
) в следующем коде (как в gcc 7.2, так и в clang 4.0)? Я бы ожидал, что это не потребуется с гарантированным копированием в С++ 17, как в случае композиции (class A
).
struct Base {
Base(Base&&) = delete;
Base& operator=(Base&&) = delete;
Base()
{
}
};
Base make_base()
{
return Base{};
}
struct A {
A() : b(make_base()) {} // <<<--- compiles fine
Base b;
};
#ifdef FAIL
struct B : public Base {
B() : Base(make_base()) {} // <<<--- "Base(Base&&) is deleted"
};
#endif
Это дефект в стандартной редакции. Исключение копирования не может быть гарантировано при инициализации подобъекта базового класса, поскольку базовые классы могут иметь разную компоновку, чем соответствующий полный тип объекта.