GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
GCC : C++11 inline object initialization (using "this") does not work when there is a virtual inheritance in hierarchy
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 public
从class A
继承,问题仍然存在。
除了您提出的从virtual
FieldIndexContainer
派生A
的解决方法外,代码还可以正常工作,而无需任何virtual
继承。
请参阅现场演示 1。
通过成员初始化,代码无需任何解决方法即可正常工作。
请参阅现场演示 2。
所以,这是一个GCC错误。
GCC 提出了一个错误报告,标题为:与虚拟继承结合使用时缺少成员的默认初始化,这与您在代码中观察到的情况非常相似。
GCC 无法调用成员的构造函数m_inB
。C++中不可能成功构造对象,但其成员之一未成功构造。
这是 GCC 中的一个错误。
相关文章:
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?