首页 > 后端开发 > C++ > 何时省略 C 初始化列表中的外大括号?

何时省略 C 初始化列表中的外大括号?

Barbara Streisand
发布: 2024-12-17 09:27:24
原创
675 人浏览过

When to Omit Outer Braces in C   Initializer Lists?

在初始化列表中省略外大括号

在 C 中,当初始化聚合类型(例如结构体或数组)时,您可能会遇到是否在初始化列表中使用外大括号的问题。对于 POD(普通旧数据)且没有用户定义的构造函数的聚合类型(例如 std::array),需要外大括号。但是,对于没有此限制的聚合,例如内置类型,可以省略这些大括号。

POD 聚合的显式大括号

在您的示例中, std::array a1 需要显式大括号,因为 std::array 是聚合和 POD 类型。聚合的第一个成员是大小为 N 的数组,其中 N 作为模板参数传递。要直接初始化该成员,您需要为内部数组使用额外的大括号。在您错误的代码示例中:

std::array<A, 2> a1 = 
{
  {0, 0.1},
  {2, 3.4}
};
登录后复制

编译器报告“太多初始值设定项”,因为缺少内部大括号。正确的带大括号的初始化是:

std::array<A, 2> a1 = 
{
  {{
    {0, 0.1},
    {2, 3.4}
  }}
};
登录后复制

为非 POD 聚合省略大括号

与 POD 聚合相反,非 POD 聚合就像内置类型不需要在初始化列表中显式地使用外大括号。例如,您的示例:

std::array<double, 2> a2 = {0.1, 2.3};
登录后复制

不包含内部数组的大括号。这是因为 double 不是聚合,并且初始化器列表直接初始化组成的 double 元素。

标准的其他见解

C 标准提供了何时使用的指导初始化列表中的外大括号可以省略:

  • 如果初始化列表以左大括号开头,则所有成员子聚合的子聚合已初始化,不需要额外的大括号。
  • 如果初始化器列表不以左大括号开头,则仅从列表中获取足够的初始化器子句来填充当前子聚合,并且任何剩余子句初始化聚合的下一个成员。

这允许使用大括号和不使用大括号进行初始化,只要数量初始化子句匹配要初始化的成员数量。

以上是何时省略 C 初始化列表中的外大括号?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板