值初始化 std::array 成员?
Value-initializing std::array member?
假设我有一个 class 模板,其中有一个 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]
- 初始化列表对
std::array
的初始化是聚合初始化
- 使用空的初始化列表进行聚合初始化会导致每个元素未被显式初始化。此类元素的初始化就像从空初始化列表中进行复制初始化一样。
- 数组
T[N]
因此是从一个空的初始化列表复制初始化的。它也是一个聚合,因此 2 和 3 递归应用。
T[N]
的 N 个元素中的每一个都是从一个空的初始化列表中复制初始化的。
- 每个 T 对象都按照
[dcl.init.list]/3
使用空的初始化列表进行复制列表初始化。到达该链的最后一个子句,内容为:
Otherwise, if the initializer list has no elements, the object is value-initialized.
瞧。使用空初始化列表 {}
初始化 std::array
会导致其元素被值初始化。
您可以使用内联成员初始化:
private:
std::array<T, 42> a{};
如果您绝对想用构造函数代替(为什么?)那么:
C()
: a{}
{ }
假设我有一个 class 模板,其中有一个 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]
- 初始化列表对
std::array
的初始化是聚合初始化 - 使用空的初始化列表进行聚合初始化会导致每个元素未被显式初始化。此类元素的初始化就像从空初始化列表中进行复制初始化一样。
- 数组
T[N]
因此是从一个空的初始化列表复制初始化的。它也是一个聚合,因此 2 和 3 递归应用。 T[N]
的 N 个元素中的每一个都是从一个空的初始化列表中复制初始化的。- 每个 T 对象都按照
[dcl.init.list]/3
使用空的初始化列表进行复制列表初始化。到达该链的最后一个子句,内容为:
Otherwise, if the initializer list has no elements, the object is value-initialized.
瞧。使用空初始化列表 {}
初始化 std::array
会导致其元素被值初始化。
您可以使用内联成员初始化:
private:
std::array<T, 42> a{};
如果您绝对想用构造函数代替(为什么?)那么:
C()
: a{}
{ }