15
我在我的项目遇到以下错误:继承,构造函数+一流初始化非默认constructabe型失败
error: use of deleted function ‘C::C(int)’ note: ‘C::C(int)’ is implicitly deleted because the default definition would be ill-formed: error: use of deleted function ‘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};
有谁知道为什么会发生这种情况?
显然,语言愿意附加在继承的构造结束多个初始化(因为它是愿意叫一个默认的构造函数)。显然,它愿意隐式地将一个调用添加到非默认构造函数(在类初始化中)到明确定义的构造函数的末尾。但由于某种原因,我不明白,它不愿意同时做两个。
根据this question,完美的转发并不是非常完美,不应该在这里使用。
注意:在实际情况下,B
的构造函数更为复杂且易于更改,因此手动转发内容并不是真正的可行选项。
问题在删除'B()'?编译器不能编写默认的'C()',因为它需要默认的'B()'存在... – Arkadiy 2014-08-29 19:00:39
程序编译时使用铿锵语言++ 3.5 – dyp 2014-08-29 19:03:43
据我了解标准,这个程序实际上很好-formed。隐式定义的'C(int)'ctor应该被定义为'C(int p):B(static_cast(p)){}' –
dyp
2014-08-29 19:04:48