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

Sva*_*zen 11 c++ default-constructor c++11 c++14

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 1

绝对这是 gcc 7 中的一个错误,因为当我在 gcc 7+ 的在线编译器中检查你的代码时,它工作得很好,没有任何问题。

因此,我在这里为您提供在线 IDE,您可以在其中设置您最喜欢的编译器并尝试进行测试(如果您愿意)。

https://godbolt.org/

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