虚拟继承与非默认构造函数

vpo*_*yev 8 c++ constructor virtual-inheritance language-lawyer

此代码被(至少)MSVC,ICC和GCC拒绝:

class A {
public:
    A( int ) {  }
};

class B: virtual public A {
public:
    //B(): A( -1 ) {  } // uncomment to make it compilable
    virtual void do_something() = 0;
};

class C: public B {
public:
    C(): A( 1 ) {  }
    virtual void do_something() {  }
};

int main() {
    C c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在...的基础上

error : no default constructor exists for class "A"
    class B: virtual public A {
                            ^
            detected during implicit generation of "B::B()" at line 14
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 如果代码确实无效,那么这个标准究竟如何?AFAICT,10.4/2和1.8/4合在一起意味着B不能是最派生类的一种类型,因此从12.6.2/10我们得到B永远不能称之为A的构造函数.(部分编号适用于C++ 11.)

  2. 如果代码有效,编译器是否违反了标准,要求存在他们无法调用的构造函数?注意,他们不仅想要从B :: B()调用A :: A(),而且他们想在编译C :: C()(双奇怪)时这样做.

PS这最初是在ICC论坛上提出的,但由于不限于此编译器而在此发布(并且未提供详细信息).

bam*_*s53 5

铛显示错误为:

error: call to implicitly-deleted default constructor of 'B'
    C(): A( 1 ) {  }
    ^
Run Code Online (Sandbox Code Playgroud)

12.1 / 5说:“如果任何虚拟基类具有类类型M和[...],则将X类的默认默认构造函数定义为已删除。 ] M没有默认的构造函数[...]。