使用默认成员初始化程序的std :: array的零初始化元素

时间:2019-01-05 13:55:47

标签: c++ c++17

假设我有一个这样的类模板:

template<typename T, size_t N>
struct S {
   std::array<T,N> a;
};

我可以在a上放置默认成员初始化程序吗,

template<typename T, size_t N>
struct S {
   std::array<T,N> a = ???;
};

使得无论T是什么,a的元素都将始终被初始化(永远不会有不确定的值)?也就是说,即使T是像int这样的原始类型。

2 个答案:

答案 0 :(得分:19)

此:

template<typename T, size_t N>
struct S {
   std::array<T,N> a = {};
};

这将递归copy-initialize each element from {}。对于int,它将初始化为零。当然,有人总是可以写:

struct A {
    A() {}
    int i;
};

这将阻止i初始化。但这就是他们。

答案 1 :(得分:6)

std::array是聚合类型。您可以使用空括号{}对其进行聚合初始化,这将相应地初始化T所保存的std::array内部数组的元素。