我当时以为这是一个叮叮当当的错误,但只想检查一下我对应该发生的事情是否正确。
我有一个默认可构造的类(我认为该类的内容不相关,只是它是默认可构造的)
struct MyClass1
{
int i{};
};
和另一个包含该类类型的const成员的类
struct MyClass2
{
const MyClass1 m;
};
然后在某个时候,我像这样创建一个MyClass2
类型的变量
MyClass2 a;
我的理解是,这应该默认构造MyClass2
的实例,而该实例又应该默认构造const
的{{1}}成员实例,但是要使用clang编译(经过测试的版本) 4.0到8)给了我编译错误
错误:调用“ MyClass2”的隐式删除默认构造函数
注意:“ MyClass2”的默认构造函数被隐式删除,因为不会初始化const限定类型“ const MyClass1”的字段“ m”
gcc会按预期方式(版本5到9)进行编译,如果我为类成员(如MyClass1
或主变量const MyClass1 m{}
中的变量添加了初始化程序,则clang会进行编译。
让我开始认为我的理解是不正确的是,当我从MyClass2 a{}
中删除初始化程序时,gcc也会出现类似的错误(我希望它可以编译,而只是MyClass1::i
被初始化),以及当我将i
设为空结构时(我认为应该没问题)。