有没有更可维护的方式来初始化结构?

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)

代码仍然可以编译,编译器认为初始化是完全可以的。但是我希望编译器在向结构中添加新成员时产生错误。可能吗?

Bri*_*ian 8

您正在使用聚合初始化,其行为是语言的内置特性,无法更改。聚合初始化将允许您保留一些未初始化的成员。但是,您可以使用告诉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)

再次,您将遇到一个问题。但是也有可能使编译器对此发出警告。

  • @TedLyngmo ewwww。让我想起了何时我尝试禁用MSVC的语言扩展(例如将临时绑定到非const引用)。这不怎么样。无法再编译自己的内部标头。 (2认同)