11

std::arrayin C++11 は、C スタック配列を介して C++ コンテナー インターフェイスを提供する便利なクラスです。

std::arrayしかし、ほとんどのコンテナーにある典型的な fill コンストラクターがないのはなぜでしょうか? 代わりに、メソッドがありfillます。

std::arrayこの点で STL コンテナ間で一意である理由はありますか?

4

3 に答える 3

6

セクション 23.3.2.1 から:

配列は、構文 array a = { initializer-list }; で初期化できる集約 (8.5.1) です。

それが機能するようstd::vectorになれば、もはや POD ではありません。さらに、同じセクションから:

集合体の条件 (8.5.1) が満たされなければならない。

これらの条件は次のとおりです。

集合体は、ユーザー提供のコンストラクター (12.1) を持たない配列またはクラス (条項 9)、非静的データ メンバーのブレースまたはイコイニシャライザー (9.2)、プライベートまたは保護された非静的データ メンバー (条項 11) を持たないクラスです。 )、基本クラスなし(条項10)、および仮想関数なし(10.3)。

于 2013-08-09T20:45:29.147 に答える
5

はい; std::array単純な配列を使用できるできるだけ多くのコンテキストで at を使用できるように、集約 (C++11 §8.5.1) を意図しています。集約には、明示的なコンストラクタまたはデストラクタを含めることはできません。

于 2013-08-09T20:44:26.530 に答える
3

誰もが「理由」をかなりうまく説明していると思うので、回避策の提案を提示します。これは、ネイティブコンストラクターと同じくらい優れたものになるようにコンパイルする必要があります。

template< typename T, std::size_t n > std::array<T,n> filledArray( const T& v ) {
    std::array<T,n> r;
    r.fill( v );
    return r;
}

auto arr = filledArray<int,4>( 7 );
于 2013-08-09T20:51:23.460 に答える