2014-08-29 74 views
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的构造函数更为复杂且易于更改,因此手动转发内容并不是真正的可行选项。

+0

问题在删除'B()'?编译器不能编写默认的'C()',因为它需要默认的'B()'存在... – Arkadiy 2014-08-29 19:00:39

+0

程序编译时使用铿锵语言++ 3.5 – dyp 2014-08-29 19:03:43

+2

据我了解标准,这个程序实际上很好-formed。隐式定义的'C(int)'ctor应该被定义为'C(int p):B(static_cast (p)){}' – dyp 2014-08-29 19:04:48

回答