【发布时间】:2020-03-16 03:52:56
【问题描述】:
假设我有一个包含std::array 成员的类模板:
template<typename T>
class C {
public:
C();
private:
std::array<T, 42> a;
};
如何定义C::C 以使a 始终是值初始化的(不是默认初始化的)?即构造函数调用T() 来初始化a 的每个元素——例如,如果T 是int,那么a 的每个元素都保证为零而不是不确定值?
int main() {
C<int> c;
assert(c.a[13] == 0); // ignoring private for exposition
}
更新
后人的附加信息:
-
std::array是具有单个元素T[N]的聚合类型 - 通过 init-list 初始化
std::array是聚合初始化 - 使用空初始化列表进行聚合初始化会导致每个元素都没有被显式初始化。此类元素的初始化就像从空的 init-list 中复制初始化一样。
- 因此,数组
T[N]是从一个空的初始化列表复制初始化的。它也是一个聚合,因此 2 和 3 递归应用。 -
T[N]的 N 个元素中的每一个都是从空的 init-list 复制初始化的。 - 根据
[dcl.init.list]/3,每个 T 对象都使用空的初始化列表进行复制列表初始化。到达该链的最后一个子句,内容如下:
否则,如果初始化列表没有元素,则对象被值初始化。
瞧。使用空的初始化列表 {} 初始化 std::array 会导致其元素被值初始化。
【问题讨论】: