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

GCC : C++11 inline object initialization (using "this") does not work when there is a virtual inheritance in hierarchy

本文关键字:初始化 对象 使用 this 不起作用 C++11 层次结构 存在 虚拟 继承 GCC      更新时间:2023-10-16

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

示例(可以在这里尝试),当使用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 publicclass A继承,问题仍然存在。

除了您提出的从virtualFieldIndexContainer派生A的解决方法外,代码还可以正常工作,而无需任何virtual继承

请参阅现场演示 1。

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

请参阅现场演示 2。

所以,这是一个GCC错误。

GCC 提出了一个错误报告,标题为:与虚拟继承结合使用时缺少成员的默认初始化,这与您在代码中观察到的情况非常相似。

GCC 无法调用成员的构造函数m_inB。C++中不可能成功构造对象,但其成员之一未成功构造。

这是 GCC 中的一个错误。