成员init的默认构造函数?

时间:2013-09-11 06:30:33

标签: c++ c++11

如果我取消注释行testfn导致编译错误。我可以使用=default添加什么构造函数以允许我定义注释输出并仍然使用TestFn()?请记住t{a}也应该有用(下面没有显示)。

struct Test2 {
    int a; int*p;
    Test2()=default;
    //Test2(int a, int b, int c){};
};
void TestFn() { Test2 t{5,nullptr}; }

1 个答案:

答案 0 :(得分:5)

如果您明确定义Test2() {},则会发生同样的事情。

这种初始化形式称为聚合初始化,只有在没有用户定义的构造函数时才适用。它不会通过任何构造函数,而是直接从支撑的初始化列表中初始化成员。所以没有什么可以默认的;你必须明确定义你想要的任何构造函数。

实际上,我觉得有点意外,显式默认的构造函数不会禁用聚合初始化。根据@juachopanza的说法,C ++ 11的具体措辞是聚合初始化取决于没有定义,特别是允许声明。