std :: array的默认初始化?

用C ++ 11 std::array ,我有保证std::array<T, N> x; 会默认初始化数组的所有元素?

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

编辑 :在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具有不确定的值一样。

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

我猜测,当你说“他们的默认值”时,你的意思是“初始化所有元素到T{} ”。 这不是默认初始化,它是值初始化(8.5 / 7)。 您可以通过为每个声明提供一个空的初始化程序,在C ++ 11中轻松请求值初始化:

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

它将依次重新初始化所有数组元素,最终生成plain_old_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-qualified)类类型,那么该对象是零初始化的......,如果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 ,则每个元素都将具有不确定的值(除非该声明恰好位于名称空间范围内)

链接地址: http://www.djcxy.com/p/67789.html

上一篇: Default initialization of std::array?

下一篇: Why is list initialization (using curly braces) better than the alternatives?