如果我取消注释行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}; }
答案 0 :(得分:5)
如果您明确定义Test2() {}
,则会发生同样的事情。
这种初始化形式称为聚合初始化,只有在没有用户定义的构造函数时才适用。它不会通过任何构造函数,而是直接从支撑的初始化列表中初始化成员。所以没有什么可以默认的;你必须明确定义你想要的任何构造函数。
实际上,我觉得有点意外,显式默认的构造函数不会禁用聚合初始化。根据@juachopanza的说法,C ++ 11的具体措辞是聚合初始化取决于没有定义,特别是允许声明。