std::array的默认初始化

Default initialization of std::array?

本文关键字:初始化 默认 array std      更新时间:2023-10-16

对于C++11 std::array,我是否可以保证语法std::array<T, N> x;将默认初始化数组的所有元素?

EDIT:如果没有,是否有一种语法可以在所有数组(包括零大小的数组)上工作,将所有元素初始化为默认值?

EDIT:在cppreference上,默认构造函数描述为:

(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array 

所以答案可能是肯定的。但我想根据标准或未来的标准来确定这一点。

根据定义,默认初始化是在没有指定其他初始化时发生的初始化;C++语言保证任何未提供显式初始值设定项的对象都将被默认初始化(C++11§8.5/11)。这包括类型为std::array<T, N>T[N]的对象。

请注意,有些类型的默认初始化无效,并使对象的值不确定:任何非类、非数组类型(§8.5/6)。因此,具有此类类型的对象的默认初始化数组将具有不确定的值,例如:

int plain_int;
int c_style_array[13];
std::array<int, 13> cxx_style_array;

c样式数组和std::array都填充有不确定值的整数,就像plain_int具有不确定值一样。

是否有一种语法适用于所有数组(包括零大小数组),将所有元素初始化为默认值?

我猜当你说";到它们的默认值";你真的是说";将所有元素初始化为CCD_ 7";。这不是默认初始化,它是值初始化

int plain_int{};
int c_style_array[13]{};
std::array<int, 13> cxx_style_array{};

它将依次对所有数组元素进行值初始化,导致plain_int以及这两种数组的所有成员被初始化为零。

默认初始化是标准中的一个术语,可能意味着根本没有初始化,所以您可能是指零初始化

cppreference.com上的描述实际上有点误导。std::array是聚合类,如果元素类型是基元,则它是POD:;普通的旧数据;语义与C语言紧密匹配。std::array< int, N >的隐式定义构造函数是一个完全不起作用的平凡构造函数。

std::array< int, 3 >()std::array< int, 3 > x{}这样提供零值的语法并不是通过调用构造函数来实现的。获取零是值初始化的一部分,在C++11§8.5/8:中指定

值初始化类型为T的对象意味着:

--如果T是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,则对象被零初始化…,如果T有一个非平凡的默认构造函数则对象被默认初始化;

std::array没有用户提供的默认构造函数,因此初始化为零。它有一个隐式定义的默认构造函数,但它很琐碎,所以它从来没有被默认初始化过。(但这并没有什么区别,因为根据定义,琐碎的初始化在运行时没有影响。)

如果没有,是否有一种语法可以在所有数组(包括零大小的数组)上工作,将所有元素初始化为默认值?

C样式数组和std::array都是聚合,完全零初始化任何聚合的方法是使用语法= {}。这是从C++98开始工作的。请注意,C样式数组不能具有零范围,并且sizeof (std::array< X, 0 >)不为零。

T x[N];std::array<T, N> x;都默认初始化数组的每个元素。

例如,如果T = std::string,则每个元素都将是一个空字符串。如果T是一个没有默认构造函数的类,那么两者都将无法编译。如果T = int,则每个元素都将具有不确定的值(除非该声明恰好在命名空间范围内)

C++11 std::array::fill在某些情况下是一个不错的选择。

首先,Tx[N]默认初始化元素,尽管标量类型T的默认初始化实际上什么都不做。以上也适用于std::array x。我认为您需要的是列表初始化。