隐式删除的默认构造函数在C ++ 14中有效

时间:2017-04-14 11:02:58

标签: c++ c++11 c++14 default-constructor

我正在为一些没有编译的代码做一些测试,我发现这段代码:

struct A {
    A(int) {};
    virtual void foo() = 0;
};

struct B : public virtual A {
    virtual void bar() = 0;
};

struct C : public B {
    C() : A(1) {}
    virtual void foo() override {}
    virtual void bar() override {}
};

int main() {
    C c;
    return 0;
}

在C ++ 11中,使用‘B::B()’ is implicitly deleted because the default definition would be ill-formed无法编译(在g ++ 7.0.1上),而在C ++ 14中编译成功。

我试图找出C ++ 14的哪个新功能允许它工作,但无济于事。 cppreference中的description没有提到任何类似的东西。

为什么这段代码可以用C ++ 14编译而不能用C ++ 11编译?

1 个答案:

答案 0 :(得分:1)

明确地说这是gcc 7中的一个错误,因为当我在使用gcc 7+的在线编译器中检出你的代码时,它完美地工作而没有任何问题。

所以在这里我给你在线IDE,在那里你可以设置你最喜欢的编译器并尝试进行测试,如果你愿意的话。

https://godbolt.org/

很抱歉,我无法帮助您,但我无法重现您的错误。