隐式删除默认的构造函数工作在C++ 14

问题描述:

我做了一些代码,没有编译一些测试,我发现这个代码:隐式删除默认的构造函数工作在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; 
} 

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

我试图找出C++ 14的哪个新功能允许这个工作,无济于事。在cppreference中的description没有提到它看起来的那种东西。

为什么这个代码可以用C++ 14编译,但不能用C++ 11编译?

+0

在Clang中使用C++ 11(和C++ 03)模式。那么GCC中的一个bug呢? –

+0

@JosephThomson我想到了那个 - 我承认我没有在铿锵中测试它,我的不好。实际上,它也可以在C++ 03模式下运行在'g ++'中。所以,也许我应该打开一个错误报告.. – Svalorzen

+0

取决于如果有人可以给你的问题的答案! –

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

所以在这里我给你在线IDE,你可以设置你最喜欢的编译器,并尝试做测试,如果你想。

https://godbolt.org/

对不起,我不能帮你更好,但我无法重现你的错误。