继承 - 构造函数+非类型 - 非默认构造类型的初始化失败

时间:2014-08-29 18:45:05

标签: c++ c++11 in-class-initialization inheriting-constructors

我在项目中遇到以下错误:

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的构造函数要复杂得多,并且可能会发生变化,因此手动转发内容并不是一个可行的选择。

1 个答案:

答案 0 :(得分:6)