27
struct MyClass
{
  std::array<int, 10> stdArr;

  MyClass() : stdArr()
  {}
};

MyClass c;

问题:

  1. c.stdArr零初始化的吗?
  2. 如果是 - 为什么?

我自己矛盾的答案:

  1. 它是零初始化的: std::array想要表现得像一个 c 数组。如果在我上面的示例stdArr中是一个 c 数组,它将stdArr()在初始化列表中被初始化为零。我希望member()在初始化列表中写入会初始化对象。

  2. 它不是零初始化的:

    • std::array通常只有一个成员,就我而言int[10] _Elems;
    • 通常基本类型和基本类型数组int[N]都不是默认初始化的。
    • std::array是一个聚合类型,这意味着它是默认构造的。
    • 因为没有初始化的自定义构造函数_Elems,我认为它不是零初始化的。

std::array根据 C++11 标准,正确的行为是什么?

4

2 回答 2

21

c.stdArr零初始化的吗?

是的

如果是 - 为什么?

这将执行 的值初始化stdArr

MyClass() : stdArr() {}

在这种情况下,值初始化的效果是对象的零初始化

编辑:什么是聚合和 POD 中有大量相关信息...?

于 2013-06-25T12:52:42.470 回答
0

“std::array 想要表现得像一个 c-array”不是标准描述行为的方式。它是一个用户定义类型,用户定义类型的成员是通过调用其构造函数来初始化的,即array<int,10>::array()

于 2013-06-25T12:44:11.700 回答