の不在ですか
std::array<T,size>::array(const T& value);
見落とし?私には非常に便利なようで、動的コンテナー ( などstd::vector
) にも同様のコンストラクターがあります。
私は十分に承知している
std::array<T,size>::fill(const T& value);
しかし、それはコンストラクターではなく、メモリは最初にゼロになります。私 が すべてこの 人-1
の ように なり たい と 思っ たら?
の不在ですか
std::array<T,size>::array(const T& value);
見落とし?私には非常に便利なようで、動的コンテナー ( などstd::vector
) にも同様のコンストラクターがあります。
私は十分に承知している
std::array<T,size>::fill(const T& value);
しかし、それはコンストラクターではなく、メモリは最初にゼロになります。私 が すべてこの 人-1
の ように なり たい と 思っ たら?
std::array
設計上、集計であるため、ユーザーが宣言したコンストラクターはありません。
あなたが言うように、fill
デフォルトの構築後に使用できます。これは集合体であるため、デフォルトの構築ではメモリがゼロにはなりませんが、初期化されていないままになります (含まれている型が自明に初期化可能である場合)。
配列がゼロで初期化されておらず、コピー コンストラクターと 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::index sequence
:
namespace detail
{
template <typename T, std::size_t...Is>
constexpr 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>
constexpr 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 でも実装できます。
static_cast<void>(Is)
提供するかもしれない悪を処理operator,
することです。T
まず、 ではなくstd::array<T>
、コンパイル時定数の積分式がstd::array<T,N>
どこにあるかです。N
第二に、std::array
設計によって集約されます。したがって、非集約にするものは何もありません。そのため、コンストラクターとデストラクタ、仮想関数などはありません。