Inheriting-Constructors + In-Class-Initialization не тип по умолчанию конструкционных объектов терпит неудачу

Я столкнулся со следующей ошибкой в ​​моем проекте:

ошибка: использование удаленной функции "C::C(int)" примечание: "C::C(int)"
неявно удалено, потому что определение по умолчанию будет неверно сформировано:
ошибка: использование удаленной функции 'M::M()'

Это код, который я использую:

struct M {
    M(int){}
    M() = delete;  // Allowing this would work.
};

struct B {
    B(int) {}
    B() = delete;
};

struct C : public B {
    using B::B;
    M n = {5};

    // C(int i) : B(i) {}  // Adding this would work
};

C c{1};

Кто-нибудь знает, почему это происходит?


Очевидно, что язык готов добавить больше инициализации в конец унаследованного конструктора (как он хочет вызвать конструктор по умолчанию). И ясно, что он хочет неявно добавить вызов конструктора не по умолчанию (инициализация класса) в конец явно определенного конструктора. Но по какой-то причине, которую я не понимаю, он не хочет делать и то и другое одновременно.

Согласно этому вопросу, идеальная пересылка на самом деле недостаточно совершенна и не должна использоваться здесь.

Примечание: в реальном случае конструктор (ы) для B намного сложнее и могут быть изменены, поэтому пересылка вручную не является приемлемым вариантом.

1 ответ

Другие вопросы по тегам