继承默认的构造函数在GCC失败,在铿锵的作品,其中一个的得到了错误?(Inheriting defa

2019-09-30 12:20发布

就拿这个简单的例子。

struct Base {
    // Base::Base() defined by the compiler
};

struct Derived: Base { 
    using Base::Base; // Should inherit Base::Base()

    Derived(int value):
        m_value(value)
    {}

private:
    int m_value; // If Base::Base() is invoked, it's default constructed
};

Derived t;

据我了解通过阅读cppreference , Derived应该继承默认Base::Base()构造函数和上面的代码应该高高兴兴地编译。

编辑 :我的坏,我链接到页面告诉完全相反的故事。 如此看来铛的得到了回归。

不过,我已经试过所有的gcc版本不及格吧,抱怨Derived没有默认的构造函数,而铛做它就好了,但只是因为3.9.0版本 ; 克++ - 7 段错误 ,甚至1。

你可以通过自己看到它godbolt 。

那么,谁的过错吗? 铛允许它,或GCC(扎段错误),不容许吗?


[1]虽然它似乎只能对godbolt,我无法在本地重现段错误。

Answer 1:

首先,编译器段错误永远是一个编译器错误。 您应该报告。

其次,默认构造从不继承。 从N3242(在N3797的措辞是相似的),[class.inhctor]:

为在候选集合中比没有参数或具有单个参数复制/移动的构造构造其他遗传构造的每个非模板的构造,构造隐含地与相同的构造特性声明,除非有与用户声明的构造在该使用声明出现在类相同的签名。

默认构造函数Base没有继承到Derived ,所以Derived t应该形成不良的,因为没有有效的构造以零个参数。


在C ++中17,这仍是形成不良的,尽管措辞是不同的。 仍然[class.inhctor],从N4618:

当B型构造被调用以初始化不同类型d的目的(即,当构造被继承(7.3.3)),初始化进行仿佛一个默认的默认的构造被用来初始化d对象和每基类子对象从它的构造是遗传的,不同之处在于子对象乙通过继承的构造的调用初始化。

要调用Base::Base()我们不得不开始与Derived::Derived() 但没有Derived::Derived()



文章来源: Inheriting default constructor fails in gcc and works in clang, which one's got the bug?