Виртуальное наследование и не -конструкторы по умолчанию

Этот код отклонен (как минимум )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;
}

на основании

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

Вопросы:

  1. Если код действительно недействителен, то как именно это следует из стандарт? AFAICT, 10.4/2 и 1.8/4 вместе взятые подразумевают, что B не может быть типом самого производного класса, и поэтому из 12.6.2/10 мы имеем, что B никогда не может вызывать конструкторы A. (Номера разделов указаны для C++11.)

  2. Если код действителен, компиляторы нарушают стандарт требующие наличия конструкторов, которые они не могли вызвать? Обратите внимание, что они не только хотят позвонить A ::A ()из B ::B (), но и хотите сделать это при компиляции C ::C()(двойной странный ).

P.S. Первоначально этот вопрос был задан на форуме ICC, но размещен здесь, поскольку не ограничивается этим компилятором (и никаких подробностей )не ожидается.

8
задан curiousguy 4 August 2012 в 17:00
поделиться