GCC:当层次结构中存在虚拟继承时,C ++ 11内联对象初始化(使用“this”)不起作用

问题描述 投票:4回答:2

当在初始化中使用此指针并且层次结构中存在虚拟继承时,C ++ 11内联对象初始化不起作用(在GCC中)。这可能是一个错误是GCC(因为它在CLang中工作)?或者C ++ 11标准本身存在差距?

示例(可以在here中尝试),当下面的代码是用GCC编译的时候:

FieldIndex m_inB{"inB", this};

没有被执行。但是在用CLang编译时会执行它。

周围的工作:从FieldIndexContainer中获取A作为虚拟

#include <string.h>
#include <iostream>
#include <list>
using namespace std;

class FieldIndexContainer
{
public:
    class FieldIndex
    {
    public:
        FieldIndex( const std::string& fieldName, FieldIndexContainer* owner) 
        {
            cout << "FieldIndex called = " << fieldName << endl;
        }
    };  
};

class A : public FieldIndexContainer
{
public:
    FieldIndex m_inA{ "inA", this};
};

class Mid : virtual public A {};

class B : virtual public Mid
{
public:     
    FieldIndex m_inB{"inB", this};
};

int main () 
{
    B* b = new B;
    return 0;
}
c++ c++11 inheritance virtual
2个回答
1
投票

您的MCVE可以进一步减少。

没有必要class Midclass B可以是继承自virtual publicclass A,问题仍然存在。

除了你提出从A导出FieldIndexContainer作为virtual的解决方法,代码也正常工作,没有任何virtual继承。

Live Demo 1

使用成员初始化,代码无需任何解决方法即可正常工作

Live Demo 2

所以,这是一个GCC错误。

为GCC提出了一个错误报告:Missing default initialization of member when combined with virtual inheritance,它与您在代码中观察到的非常相似。


1
投票

GCC未能调用成员m_inB的构造函数。在成功构造对象时,C ++中没有可能的情况,但其中一个成员不是。

这是GCC中的一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.