さて、元のconst int b[10];
は、配列を初期化できる場合にのみ役に立ちます。したがって、std::array
の例は両方とも実際には機能しません。
1:
std::array<const int, 10> c;
これはconst int c[10];
に最も近いです。問題は、そのためのデフォルトのコンストラクタが存在しないことと、要素が変更可能でないため、これを使用することは無駄です。コンストラクタで初期化する必要があります。そのままでは、デフォルトのコンストラクタが要素を初期化しなかったため、コンパイラエラーが発生します。
このコードは、c
は変更可能ですが、要素自体は変更できないことを意味します。しかし実際には、要素に影響しないc
に突然変異はありません。
2:
const std::array<int, 10> d;
これは、d
は可変ではなく、要素は可変タイプint
です。 const
はメンバーに伝播するため、要素が依然として呼び出し元によって変更可能でないことを意味します。上記の例と同様に、const
であるため、d
を初期化する必要があります。
実際には、array
の変更可能な操作は常に要素に触れるため、実際には両方とも変更可能性についてはのように動作します。
+1スタックに決して静的配列が割り当てられません。 _fixed size_配列は、スタック(auto storage declspec)またはグローバルデータセグメント(static storage declspec)に割り当てることができます。トリビア: 'typedef int ints_t [10]; ints_t * ints = new ints_t(); 'は' ints'固定サイズの配列か動的配列ですか? – sehe
両方の配列を宣言すると、初期化が必要です。 IMHOでは、2つの間に違いはありません - アルゴリズムと使用の観点からはまったく同じです(実際はイテレータは同じです; const int *)。率直に言って、宣言する最良の方法は、あなたが答えで言う通りです。 'const std :: array c;'これは非常に具体的なもので、const intのconst配列です。 –
Nim