繁体   English   中英

初始化std :: array <T,N> 当T不是默认可构造的时,在构造函数初始化器列表中

[英]Initialization of std::array<T,N> in constructor initializer list when T is not default-constructible

出于这个问题的动机,我想知道如果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) };

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM