std::array
in C++11 は、C スタック配列を介して C++ コンテナー インターフェイスを提供する便利なクラスです。
std::array
しかし、ほとんどのコンテナーにある典型的な fill コンストラクターがないのはなぜでしょうか? 代わりに、メソッドがありfill
ます。
std::array
この点で STL コンテナ間で一意である理由はありますか?
セクション 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)。
はい; std::array
単純な配列を使用できるできるだけ多くのコンテキストで at を使用できるように、集約 (C++11 §8.5.1) を意図しています。集約には、明示的なコンストラクタまたはデストラクタを含めることはできません。
誰もが「理由」をかなりうまく説明していると思うので、回避策の提案を提示します。これは、ネイティブコンストラクターと同じくらい優れたものになるようにコンパイルする必要があります。
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 );