我在项目中遇到以下错误:
错误:使用了已删除的函数"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
的构造函数要复杂得多,而且可能会发生更改,因此手动转发内容并不是一个可行的选择。
这是一个GCC Bug,现已被报告。