std :: array <int,10>作为类成员进行了零初始化吗?

Pet*_*ter 25 c++ c++11 stdarray

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

  MyClass() : stdArr()
  {}
};

MyClass c;
Run Code Online (Sandbox Code Playgroud)

问题:

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

我自己的矛盾答案:

  1. 它是零初始化的: std::array希望表现得像一个c-array.如果在上面的例子中stdArr是一个c-array,它将stdArr()在初始化列表中进行零初始化.我希望member()在初始化列表中写入初始化对象.

  2. 它不是零初始化的:

    • std::array 通常只有一个成员,在我的情况下 int[10] _Elems;
    • 通常基本类型和基本类型的数组int[N]都不是默认初始化的.
    • std::array 是一种聚合类型,暗示它是默认构造的.
    • 因为没有自定义构造函数初始化_Elems,我认为它不是零初始化.

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

jua*_*nza 20

c.stdArr零初始化?

如果是 - 为什么?

该执行值初始化stdArr:

MyClass() : stdArr() {}
Run Code Online (Sandbox Code Playgroud)

在此上下文中,值初始化的效果是对象的零初始化.

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

  • 我原以为`:stdArr()`只是调用std :: array默认构造函数,它什么都不做!? (4认同)
  • @ Martin85这不是它的工作原理.人们必须提供一个不做任何事情的用户定义的默认构造函数(在过程中将`std :: array`渲染为非聚合).这是一个句柄C++使我们能够对POD和聚合进行零初始化. (4认同)