【问题标题】:initializing struct with {0}使用 {0} 初始化结构
【发布时间】:2020-02-23 16:56:13
【问题描述】:

我正在调试一些与此基本相同的代码:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };

当我创建Bar 的实例时,似乎ab 都被初始化为零。这是有保证的吗?在规范中哪里可以找到?

【问题讨论】:

  • try: struct Foo { int a{}; int b{}; }; 注意变量名后面的大括号。那么您将始终获得初始化值。如果您需要使用其他值和定义的行为进行初始化,则需要为每个其他类编写一个 ctor
  • @skratchi.at 那些不是括号(使用括号意味着别的)
  • 表面上这么简单的问题,但是 C++ init 太复杂了,我明白你为什么要问它。我可能会猜测您在这里得到了正确的聚合初始化但是没有深入研究标准我不确定答案是什么。有多难过?
  • 这是针对数组的,但是... stackoverflow.com/questions/1065774/…
  • 另一个类似的问题:stackoverflow.com/questions/1069621/…

标签: c++ initialization


【解决方案1】:

根据cppreference.com

如果初始化子句的数量小于成员[和基(C++17 起)] 的数量或初始化列表完全为空,则初始化剩余的成员[和基(C++17 起)] [通过它们的默认成员初始化器,如果在类定义中提供,否则 (C++14 起)] 通过空列表,根据通常的列表初始化规则(对非类类型和非- 具有默认构造函数的聚合类,以及聚合的聚合初始化)。如果引用类型的成员是这些剩余成员之一,则程序是非良构的。

Foo 没有默认成员初始化器 (int b{0};),因此 b 将通过列表初始化以空列表进行初始化,这意味着非类类型的值初始化:b = int() // = 0

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多