初始化 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
.
编译
这两种方式初始化结构有区别吗:
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
.