初始化 C++ 结构

Initializing a C++ Structure

这两种方式初始化结构有区别吗:

structVar = {}

structVar = {0}

这实际上取决于结构的性质。

如果是聚合的话,两者在很大程度上是等价的。然而,第一个是通用的,因为它只是对结构进行值初始化。第二个要求结构的第一个成员可以用 0 初始化,并初始化其余元素,就好像它们每个都由空初始化器 {} 初始化一样,换句话说,

structVar = {0, {}, {}, {}, ..... };

所以每个剩余的元素都是值初始化的

如果不是聚合,则取决于提供了哪些构造函数(如果有)。根本没有足够的信息可以说。

更正

如果结构是聚合,则这两个定义执行相同的操作。来自 C++11 标准 (N3337):

8.5.1/7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from its brace-or-equal-initializer or, if there is no brace-or-equal- initializer, from an empty initializer list (8.5.4).

如果结构包含两个成员,例如

struct S
{
    int x;
    double y;
};

然后 structVar = {} 将对成员进行值初始化,即它们将变为零(或者如果成员是非 PODs,则将调用默认构造函数)。

structVar = {0} 行将只用零初始化结构的第一个成员。由于在这种情况下您有一个聚合,其余成员由空列表进行值初始化,因此实际上您有

structVar = {0, {} };

C++14 为包含大括号或相等初始化成员的聚合添加了聚合初始化的可能性,即

struct S
{
    int x;
    double y{1.1}; // or double y = 1.1;
}

在这种情况下,

structVar = {0};

用 0 初始化 x,用 1.1 初始化 y。这在 C++14 之前是不可能的。

PS: 刚刚测试了上面的代码,clang++ 用 -std=c++1y 编译它,但是 g++ 4.9.2 拒绝它,即使我用 -std=c++14.

编译