成员初始化的默认构造函数

default constructor for member init?

本文关键字:构造函数 默认 初始化 成员      更新时间:2023-10-16

如果我取消注释,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}; }

如果您显式定义Test2() {},也会发生同样的事情。

这种形式的初始化称为聚合初始化,它仅在没有用户定义的构造函数时才适用。它不通过任何构造函数,而是直接从大括号初始值设定项列表中初始化成员。所以没有什么可以默认的;您必须显式定义所需的任何构造函数。

实际上,我对显式默认构造函数不禁用聚合初始化感到有些惊讶。据@juachopanza称,第11 C++11条的措词具体规定,聚合初始化不以任何定义为条件,具体允许作出声明。