此代码被(至少)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 论坛上提出的,但由于不限于此编译器(并且没有详细信息),所以在此处发布。