15

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

错误:使用已删除的函数 '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要复杂得多并且可能会发生变化,因此手动转发东西并不是一个真正可行的选择。

4

1 回答 1

6

这是一个 GCC 错误,现已报告。

于 2014-08-29T22:25:47.667 回答