clang不会默认构造const类成员

时间:2019-08-01 23:42:52

标签: c++ c++11 language-lawyer

我当时以为这是一个叮叮当当的错误,但只想检查一下我对应该发生的事情是否正确。

我有一个默认可构造的类(我认为该类的内容不相关,只是它是默认可构造的)

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设为空结构时(我认为应该没问题)。

0 个答案:

没有答案