gpt4 book ai didi

c++ - 为什么我的结构的成员没有使用 `{}` 正确初始化?

转载 作者:IT老高 更新时间:2023-10-28 21:38:30 28 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>

struct T
{
int a, b, c;
};

int main()
{
T t = {0};
std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}

Output :

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';
}

Output :

1,0,0

我期待 1,1,1而是。

为什么我的struct的成员没有被正确初始化?

最佳答案

当您编写 = {0} 时,它只会显式初始化 第一个成员;其余部分根据标准隐式初始化为零,因此乍一看似乎您使用您编写的 0 显式初始化所有成员,但是您没有

你写0的地方只影响第一个成员。因此,有一天,当您将其更改为 1 并认为它会更改所有成员时,您就会遇到一个错误,就像这里一样。 这是误导/危险/愚蠢/脆弱的代码。

因此,如果没有随附的解释性注释,= {0} 将无法通过我团队的代码审查。你原本应该这样写:

T t = {};

现在,要根据新要求解决您的问题,您应该编写:

T t = {1,1,1};

或者,如果您不介意您的 struct 可能会失去 POD 特性,请给 T 一个构造函数。


正式的措辞

[C++11: 8.5.1/2]: When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order. Each member is copy-initialized from the corresponding initializer-clause. If the initializer-clause is an expression and a narrowing conversion (8.5.4) is required to convert the expression, the program is ill-formed. [..]

[C++11: 8.5.1/6]: An initializer-list is ill-formed if the number of initializer-clauses exceeds the number of members or elements to initialize.

[C++11: 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 an empty initializer list (8.5.4).

关于c++ - 为什么我的结构的成员没有使用 `{}` 正确初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797810/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com