2011-10-17 5 views
18

これは、古き良きCの配列です:定数配列

int a[10]; 

そして、これがconstある古き良きCの配列である:C++で

const int b[10]; 

、定義する2つの方法があるように思われますconstあるstd::array S:

std::array<const int, 10> c; 
const std::array<int, 10> d; 

は、これら二つの定義・エクイですバレントですか?もしそうなら、慣用的なものは何ですか?そうでない場合、違いは何ですか?

答えて

9

さて、元の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の変更可能な操作は常に要素に触れるため、実際には両方とも変更可能性についてはのように動作します。

5

上位定義では、スタックに定数整数の配列が割り当てられますが、2番目には可変整数の定数配列が割り当てられます。最初のケースでは、宣言時に配列の内容を定義する必要があります。その内容は定数であり、後で変更することはできないからです。私は、静的アレイは常にスタック上に割り当てられ、その最初の要素へのポインタは、後で変更することはできませんので、最初の2番目の宣言も

const std::array<const int,10> c; 

ようなものを生成する、推測します。

+1

+1スタックに決して静的配列が割り当てられません。 _fixed size_配列は、スタック(auto storage declspec)またはグローバルデータセグメント(static storage declspec)に割り当てることができます。トリビア: 'typedef int ints_t [10]; ints_t * ints = new ints_t(); 'は' ints'固定サイズの配列か動的配列ですか? – sehe

+3

両方の配列を宣言すると、初期化が必要です。 IMHOでは、2つの間に違いはありません - アルゴリズムと使用の観点からはまったく同じです(実際はイテレータは同じです; const int *)。率直に言って、宣言する最良の方法は、あなたが答えで言う通りです。 'const std :: array c;'これは非常に具体的なもので、const intのconst配列です。 – Nim

5

彼らは等価ではありません - c.referenced.reference一方int&です(あなたがのtypedefにアクセスするには、その構文を使用することができますが、あなたはテンプレート引数控除によってタイプをキャプチャし、違いを見分けることができないということ)const int&です。

しかし私は確かにtenfourが重要な観察を持っていると確信しています。 "cには要素に影響しない突然変異はありません"。したがって、実際に配列に行うことは、それらが同じであることを心配する限り、異なる型のために異なるメタデータを持つだけです。

私は、イテレータまたは範囲テンプレートパラメータを取ることとは対照的に、インタフェースで型自体を使用すると、どこに違いがあるのだろうと思います。私はポインタまたは参照パラメータとしてそれを取るときには型をconst修飾しなければならないと言っています。それはあなたに何の費用もかからず、発信者があなたの選択をあなたの選択に使用できるようにするからです。あなたはかもしれません要素タイプをconst修飾しますが、使用するものはどちらとも互換性がないため、基本的に誰が使用するかに同意しなければなりません。それは、あなたが世界の誰もが一番合意するようになるとは思っていないので、スタイルに関して積極的な調整が必要です。 const intはおそらくより良いケースを持っています。constはすべて可能ですが、intは、C++ 03のすべてのコンテナに慣れているので、人々はそれについて全く考えていないものを使用すると思います値のタイプはconstではありません。

関連する問題