当 T 不可默认构造时,构造函数初始值设定项列表中 std::array<T,N> 的初始化



受这个问题的启发,我想知道如果TN都是模板参数并且T不是默认构造的,那么在构造函数初始值设定项列表中构造std::array<T,N>是否安全。我想出了以下辅助函数:

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) };

除非删除复制构造函数(或删除隐式构造函数,这要求某个子对象具有已删除的复制构造函数或类似性质的东西(,否则每种类型都可以进行复制构造。因此,对于任何(非数组对象(类型的值tT,如果它是可复制的,T t2 = t;将起作用。

最新更新