83

の不在ですか

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

見落とし?私には非常に便利なようで、動的コンテナー ( などstd::vector) にも同様のコンストラクターがあります。

私は十分に承知している

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

しかし、それはコンストラクターではなく、メモリは最初にゼロになります。私 が すべてこの 人-1の ように なり たい と 思っ たら?

4

5 に答える 5

56

std::array設計上、集計であるため、ユーザーが宣言したコンストラクターはありません。

あなたが言うように、fillデフォルトの構築後に使用できます。これは集合体であるため、デフォルトの構築ではメモリがゼロにはなりませんが、初期化されていないままになります (含まれている型が自明に初期化可能である場合)。

于 2013-07-29T12:14:08.830 に答える
23

配列がゼロで初期化されておらず、コピー コンストラクターと 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');
于 2013-07-29T12:16:55.797 に答える
15

そのために使用できます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_sequenceC++14 ですが、C++11 でも実装できます。

static_cast<void>(Is)提供するかもしれない悪を処理operator,することです。T

于 2016-12-21T09:16:54.470 に答える
10

まず、 ではなくstd::array<T>、コンパイル時定数の積分式がstd::array<T,N>どこにあるかです。N

第二に、std::array設計によって集約されます。したがって、非集約にするものは何もありません。そのため、コンストラクターとデストラクタ、仮想関数などはありません。

于 2013-07-29T12:14:46.223 に答える