初始化C ++结构

时间:2015-01-23 15:16:56

标签: c++ struct initialization

这两种方式初始化结构之间是否存在差异:

structVar = {}

structVar = {0}

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:4)

<强>校正

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

  

8.5.1 / 7如果列表中的initializer-clause少于聚合中的成员,那么未明确初始化的每个成员都应从其括号或等于初始值初始化,如果没有brace-or-equal-initializer,来自空的初始化列表(8.5.4)。

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

struct S
{
    int x;
    double y;
};

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

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编译它,但是即使我用-std=c++14进行编译,g ++ 4.9.2也拒绝它。