当在初始化中使用此指针并且层次结构中存在虚拟继承时,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;
}
您的MCVE可以进一步减少。
没有必要class Mid
。 class B
可以是继承自virtual public
的class A
,问题仍然存在。
除了你提出从A
导出FieldIndexContainer
作为virtual
的解决方法,代码也正常工作,没有任何virtual
继承。
使用成员初始化,代码无需任何解决方法即可正常工作
所以,这是一个GCC错误。
为GCC提出了一个错误报告:Missing default initialization of member when combined with virtual inheritance,它与您在代码中观察到的非常相似。
GCC未能调用成员m_inB
的构造函数。在成功构造对象时,C ++中没有可能的情况,但其中一个成员不是。
这是GCC中的一个错误。