Nur*_*yev 1 c++ struct initialization
假设您有一个这样的结构:
struct Foo {
int a;
};
Run Code Online (Sandbox Code Playgroud)
目前,我正在像这样初始化它:
Foo foo = {1};
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加另一个成员:
struct Foo {
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
代码仍然可以编译,编译器认为初始化是完全可以的。但是我希望编译器在向结构中添加新成员时产生错误。可能吗?
您正在使用聚合初始化,其行为是语言的内置特性,无法更改。聚合初始化将允许您保留一些未初始化的成员。但是,您可以使用告诉GCC和Clang发出警告-Wmissing-field-initializers。您也可以使用将其转换为错误-Werror=missing-field-initializers。
您还可以通过使您的类不是聚合来禁止语言本身内部的聚合初始化,而是强制用户使用您声明的构造函数:
struct Foo {
int a;
int b;
Foo(int a, int b) : a(a), b(b) {}
};
Run Code Online (Sandbox Code Playgroud)
现在Foo foo = {1};将无法编译,因为聚合初始化不适用于此处,并且构造函数的参数不足。
但是,请记住,如果声明的构造函数未能初始化所有成员,例如,则偶然编写了如下代码:
struct Foo {
int a;
int b;
Foo(int a, int b) : a(a) {}
};
Run Code Online (Sandbox Code Playgroud)
再次,您将遇到一个问题。但是也有可能使编译器对此发出警告。