为什么std ::数组没有一个构造函数需要填充数组的值?

是没有的

std::array<T,size>::array(const T& value); 

一个疏忽? 这似乎对我有用,dynamic容器(如std::vector )确实有一个类似的构造函数。

我完全知道

 std::array<T,size>::fill(const T& value); 

但这不是构造函数,内存将首先被清零。 如果我想要所有-1 这样的人呢?

std::array在devise上是一个聚合,所以没有用户声明的构造函数。

正如你所说,你可以在默认构build之后使用fill 。 由于它是一个聚合,默认构造不会使内存为零,但会使其不被初始化(如果包含的types是可初始化的)。

请注意,通过利用数组不是零初始化的事实,可以有效地模拟这种types的构造函数,并具有复制构造函数和do。

 template <size_t N, class T> array<T,N> make_array(const T &v) { array<T,N> ret; ret.fill(v); return ret; } auto a = make_array<20>('z'); 

首先,它不是std::array<T> ,它是std::array<T,N>其中N是编译时间常量的整型expression式。

其次, std::array是按照devise进行聚合的。 所以它没有任何东西使它非聚合,这就是为什么它没有构造函数和析构函数,虚函数等。

您可以使用std::index sequence

 namespace detail { template <typename T, std::size_t...Is> std::array<T, sizeof...(Is)> make_array(const T& value, std::index_sequence<Is...>) { return {{(static_cast<void>(Is), value)...}}; } } template <std::size_t N, typename T> std::array<T, N> make_array(const T& value) { return detail::make_array(value, std::make_index_sequence<N>()); } 

演示

std::make_index_sequence是C ++ 14,但可以在C ++ 11中实现。