Я столкнулся со следующей ошибкой в моем проекте:
ошибка: использование удаленной функции ‘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
намного сложнее и могут быть изменены, поэтому пересылка вручную не является приемлемым вариантом.