C 11 具有非静态成员初始化器的类的聚合初始化
在 C 11 中,如果类或结构满足以下条件,则将其视为聚合:满足特定标准,包括没有用户定义的构造函数、非静态数据成员没有大括号或等号初始化程序以及没有私有或受保护的非静态数据成员。
但是,在标准 C 11 中,将非静态成员初始值设定项添加到类或结构会更改其作为聚合的状态。这是因为成员初始值设定项类似于用户定义的构造函数,这使类或结构失去了作为聚合的资格。定义中的这种更改可能会导致意外的行为。
在提供的示例中:
struct A { int a = 3; int b = 3; }; A a{0,1}; // ???
由于存在类内成员初始值设定项,类 A 不再被视为聚合。结果,聚合初始化A a{0,1};无效。
此行为在 C 14 中进行了修订,其中非静态成员初始值设定项的存在不再阻止类或结构成为聚合。因此,在 C 14 中,A 的聚合初始化是有效的。
需要注意的是,C 标准发生了变化,必须检查标准的最新版本或使用兼容的 C 14 或更高版本的编译器,以确保正确解释涉及聚合初始化和非静态成员初始值设定项的代码。
以上是具有非静态成员初始值设定项的 C 类可以是聚合吗?的详细内容。更多信息请关注PHP中文网其他相关文章!