为什么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中实现。