このコードは、(少なくとも)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用です。)
コードが有効な場合、コンパイラーは、呼び出すことができなかったコンストラクターの存在を要求することにより、標準に違反していますか?彼らはB::B()からA :: A()を呼び出したいだけでなく、 C :: C()のコンパイル中にそれを実行したいことに注意してください(ダブルストレンジ)。
PSこれは元々ICCフォーラムで質問されましたが、このコンパイラに限定されていないため(詳細は発表されません)、ここに投稿されました。