提问人:Lightness Races in Orbit 提问时间:2/10/2013 最后编辑:Matthieu M.Lightness Races in Orbit 更新时间:2/10/2013 访问量:5562
为什么我的结构成员没有使用“{}”正确初始化?[复制]
Why are my struct's members not properly initialised using `{}`? [duplicate]
问:
我有以下代码:
#include <iostream>
struct T
{
int a, b, c;
};
int main()
{
T t = {0};
std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}
输出:
0,0,0
多年来,这段代码在关键的生产环境中愉快地运行,发挥着至关重要的功能,项目的要求发生了变化,我需要输出。1,1,1
所以,我改成:{0}
{1}
#include <iostream>
struct T
{
int a, b, c;
};
int main()
{
T t = {1};
std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}
输出:
1,0,0
相反,我预料到了。1,1,1
为什么我的 的成员没有被正确初始化?struct
答:
当你编写 时,它只会显式初始化第一个成员;其余的都是根据标准隐式初始化的,所以乍一看,你似乎用你写的 明确初始化了所有成员,但你没有。= {0}
0
你写的那个地方只影响第一个成员。因此,当有一天,你把它改成认为它会改变所有成员时,你就会遇到一个错误,就像这里一样。这是误导性/危险/愚蠢/脆弱的代码。0
1
出于这个原因,如果没有附带的解释性评论,将不会在我的团队中通过代码审查。你最初应该写:= {0}
T t = {};
现在,要根据新的要求解决您的问题,您应该编写:
T t = {1,1,1};
或者,如果你不介意你可能会失去 POD,请给出一个构造函数。struct
T
正式措辞
[C++11: 8.5.1/2]:
当聚合由初始值设定项列表初始化时(如 8.5.4 中指定),初始值设定项列表的元素将作为聚合成员的初始值设定项,按递增的下标或成员顺序排列。每个成员都从相应的初始值设定项子句进行复制初始化。如果 initializer-clause 是一个表达式,并且需要缩小转换 (8.5.4) 来转换表达式,则程序格式不正确。[..]
[C++11: 8.5.1/6]:
如果初始值设定项子句的数量超过要初始化的成员或元素的数量,则初始值设定项列表的格式不正确。
[C++11: 8.5.1/7]:
如果列表中的初始值设定项子句数少于聚合中的成员数,则应从空的初始值设定项列表 (8.5.4) 初始化每个未显式初始化的成员。
评论
= { 0 }
= { 0 }
评论
{0}