Этот код отклонен (как минимум )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
Вопросы:
Если код действительно недействителен, то как именно это следует из стандарт? AFAICT, 10.4/2 и 1.8/4 вместе взятые подразумевают, что B не может быть типом самого производного класса, и поэтому из 12.6.2/10 мы имеем, что B никогда не может вызывать конструкторы A. (Номера разделов указаны для C++11.)
Если код действителен, компиляторы нарушают стандарт требующие наличия конструкторов, которые они не могли вызвать? Обратите внимание, что они не только хотят позвонить A ::A ()из B ::B (), но и хотите сделать это при компиляции C ::C()(двойной странный ).
P.S. Первоначально этот вопрос был задан на форуме ICC, но размещен здесь, поскольку не ограничивается этим компилятором (и никаких подробностей )не ожидается.