std::array的默认初始化
Default initialization of std::array?
对于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。我认为您需要的是列表初始化。
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 副本初始化的默认模板参数推导
- 使用 std::分配器在 constexpr 中进行默认初始化
- 在C++中使用默认构造函数初始化对象的不同方法
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数时使用垃圾数据初始化对象
- 为什么对象默认初始化,但基元不在C++?
- 默认参数和空列表初始化
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++中未初始化成员布尔变量的默认值是多少?
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- 如何用默认值0或-1初始化unordered_set
- C++11 默认类成员初始化与初始值设定项列表同时
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在皮条类中初始化默认值的最佳位置
- 值初始化:默认初始化或零初始化