Почему RVO не применяется к базовой инициализации? - программирование
Подтвердить что ты не робот

Почему RVO не применяется к базовой инициализации?

Почему конструктор перемещения для 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

пример

4b9b3361

Ответ 1

По словам Ричарда Смита:

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