C++11 std::array的默认初始化?

C++11 std::array的默认初始化?,c++11,initialization,default-constructor,stdarray,C++11,Initialization,Default Constructor,Stdarray,使用C++11std::array,我是否可以保证语法std::array x是否默认初始化数组的所有元素 编辑:如果没有,是否有一种语法可用于所有数组(包括零大小数组)以将所有元素初始化为其默认值 编辑:在上,默认构造函数说明显示: (constructor) (implicitly declared) (public member function) default-constructs or copy-constructs every element of the array 所以答案

使用C++11
std::array
,我是否可以保证语法
std::array x是否默认初始化数组的所有元素

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

编辑:在上,默认构造函数说明显示:

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

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

两者都
tx[N]
std::数组x默认值初始化数组的每个元素


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

根据定义,默认初始化是在未指定其他初始化时发生的初始化;C++语言保证了您不提供显式初始化器的任何对象都将缺省初始化(C++ 11×8.5 / 11)。它包括类型为
std::array
T[N]
的对象

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

int plain_int;
int c_style_array[13];
std::array<int, 13> cxx_style_array;
这将依次初始化所有数组元素的值,从而导致
plain_int
,以及这两种数组的所有成员被初始化为零。

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

cppreference.com上的描述实际上有点误导
std::array
是一个聚合类,如果元素类型是primitive,那么它就是POD:“纯旧数据”,语义与C语言非常匹配。
std::array
的隐式定义构造函数是一个微不足道的构造函数,它完全不起任何作用

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

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

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

std::array
没有用户提供的默认构造函数,因此初始化为零。它有一个隐式定义的默认构造函数,但它并不重要,所以它从来都不是默认初始化的。(但这并没有什么区别,因为根据定义进行的简单初始化在运行时没有效果。)

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


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

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

C++11在某些情况下是一个很好的选择。

不这样认为。它是默认声明的,因此基本上相当于
tx[N]
语法这会让我得到十二个零吗?@gerardw根据标准,是的。注意MSVC中的错误,它无法正确实现一些值初始化的情况。确实boost这么说,并用他们的
boost::value_initialized
解决了这个问题,但我相信VC12(VS2013)现在有了更好的支持。这让我希望comitee将标准更改为默认值初始化,并在请求时破坏值。即std::array={std::undermined};或者something@user这是一个错误;
plain\u int
是有意的。已修复。您的示例非常具有解释性,应该是公认答案的一部分
int plain_int{};
int c_style_array[13]{};
std::array<int, 13> cxx_style_array{};