由this question激励,我想知道在构造函数初始值设定项列表中构造std::array<T,N>
是否安全,如果T
和N
都是模板参数,T
}不是默认构造的。我提出了以下帮助函数:
template <typename T, size_t... I>
constexpr auto make_array_impl(std::index_sequence<I...>, const T& val) {
return std::array<T, sizeof...(I)>{ (I, val)... };
}
template <typename T, size_t N>
constexpr auto make_array(const T& val) {
return make_array_impl<T>(std::make_index_sequence<N>{}, val);
}
现在,如果我有一个类如:
class E {
public:
E() = delete;
E(int, int, int) { }
};
我可以写:
template <typename T, size_t N>
class A {
public:
template <typename... Args>
A(Args&&... args) : a_(make_array<T, N>(T(std::forward<Args>(args)...))) { }
private:
std::array<T, N> a_;
};
然后
A<E, 5> a(1, 2, 3);
这适用于我启用GCC 8.1 / Clang 6.0和C ++ 14。但是,我不确定构造函数初始值设定项列表中a_
的初始化是否正确,如果是,那么此核心性是否依赖于模板参数T
。
(说实话,我甚至在标准中找不到std::array
是否可以由另一个std::array
初始化。它是否是聚合初始化的一部分?或者,是吗? std::array
支持复制初始化?)
澄清问题,我希望通过
实现的目标A<E, 5> a(1, 2, 3);
是a::a_
成员函数将有效地启动为
std::array<E, 5> a::a_ = { E(1,2,3), E(1,2,3), E(1,2,3), E(1,2,3), E(1,2,3) };
答案 0 :(得分:1)
除非您删除复制构造函数(或者删除了隐式复制构造函数,这要求某些子对象具有已删除的复制构造函数或某种性质的东西),否则每个类型都可以进行复制构造。因此,对于任何(非数组对象)类型t
的值T
,如果它是可复制的,T t2 = t;
将起作用。