C++ 使用虚拟继承和委托构造函数时构造函数崩溃

C++ 使用虚拟继承和委托构造函数时构造函数崩溃,c++,visual-c++,c++11,virtual-inheritance,delegating-constructor,C++,Visual C++,C++11,Virtual Inheritance,Delegating Constructor,我得到了MSVC 2013编译器与上述代码崩溃。当使用GCC4.7.2编译时,它不会崩溃。下面描述了类的层次结构 struct D { virtual void m() const = 0; }; struct D1 : public virtual D { }; struct D2 : public virtual D { }; struct B : public D2 { B() { } B(int val) : B() { } void m() c

我得到了MSVC 2013编译器与上述代码崩溃。当使用GCC4.7.2编译时,它不会崩溃。下面描述了类的层次结构

struct D
{
    virtual void m() const = 0;
};

struct D1 : public virtual D { };

struct D2 : public virtual D { };

struct B : public D2
{
    B() { }

    B(int val) : B() { }

    void m() const { }
};

struct A : public B, public D1
{
    A() : B(0) { }
};

int main()
{
    A a;
    return 0;
}

这是MS编译器中的错误,或者我在代码中犯了错误?

据我所知,您的代码示例应该可以工作

不过,顺便说一句,您的构造函数委托可能被认为是不好的做法。您应该有一个完全定义的构造函数,所有定义较少的构造函数都委托给它,而不是反过来。例如:

         D
       /  \
     D1    D2
      |     |
       \    B
        \  /
         A

对MSVC++2013编译器生成的汇编代码的快速检查表明,从
B::B(int)
B()
的委托调用不正确。这是编译器中的一个bug

MSVC++构造函数有一个隐藏的布尔参数,告诉构造函数它是在构造最派生的对象(
true
)还是在构造嵌入的基子对象(
false
)。在本例中,只有
A::A()
应在该隐藏参数中接收
true
,而所有较低级别的构造函数调用应接收
false
。但是,当从
B::B(int)
调用
B()
时,编译器无条件地将
1
true
)作为隐藏参数传递。这是不正确的

struct B : public D2
{
    B() : B(0) { }

    B(int val) { }

    void m() const { }
};
;`B::B(int)的代码`
...

00F05223推送1;在我看来,
A而不是
D*D=新的A
也会出现错误。可能是这个错误:它在Mac OS上运行正常,并伴有叮当声。如果你真的想对此进行全面诊断,你可能需要生成汇编代码并深入研究。好奇。。现在我必须让vs 2013try@singh,这只是授权。这应该是合法的。
; Code for `B::B(int)`
...
00F05223  push        1                     ; <- this is the problem
00F05225  mov         ecx,dword ptr [this]  
00F05228  call        B::B (0F010F0h)       ; <- call to `B::B()`
...