2017-12-20 13 views
4

このような初期化子リスト使用:出力に含まは、同じ順序である3、1、6、最後に4.だから私は、コンパイラがstd::vector<int>に似たものを使用していないする必要があります知っているC++コンパイラはこの初期化子リストで何をしますか?

for (int i : {3, 1, 6, 4}) 
{ 
    std::cout << "i=" << i << std::endl; 
} 

std::set<int>

これは保証されていますか?コンパイラがどのように解釈する必要があるのか​​を説明するドキュメントはどこにありますか{3, 1, 6, 4}

+3

http://en.cppreference.com/w/cpp/utility/initializer_list – Fureeish

+2

現在の標準では。ダウンロード可能なドラフトには、[link](http://en.cppreference.com/w/cpp/links)があります。 – Ron

答えて

6

range based loopstd::initializer_list<int>の一時オブジェクトを構成する範囲式としてbraced-init-listを使用しています。注文は保証されているため8.5.4.5。 n4140 draft/standard状態のパラグラフ(強調鉱山):実装はN要素の一時的 アレイを割り当てかのよう

型STDのオブジェクト:: initializer_list <E>は 初期化子リストから構成されているタイプEの型。ここで、Nはイニシャライザリスト内の 要素の数です。

9

std::initializer_list<int>のインスタンスを作成しています。詳細は、http://en.cppreference.com/w/cpp/utility/initializer_listを参照してください。そのページから

タイプstd::initializer_list<T>の目的は、タイプconst Tのオブジェクトの配列へのアクセスを提供する軽量のプロキシオブジェクトです。

出力順序は保証されています。しかし、これはコンパイラがstd::vector<int>を作成するためではありません。これは、initializer_listの下にintの配列があるため保証されます。

+0

サイド質問: 'std :: initializer_list'のコンストラクタは' const T * 'を取るので、コンパイラは' T [] 'の寿命をどのように管理しますか?そこに一時的なアドレスを取っていないexplicitsどこかのコードはありますか、それは特別なケースとしてコンパイラによって直接処理されますか? (範囲ベースの場合と同じですが、これが意味をなさないか分かりません) –

+1

@ n.caillou、コンストラクタは 'const T *'を入力として取りません。コンパイラはコンパイル時にトークンを処理し、適切なサイズの 'std :: initializer_list '型のオブジェクトを構築するコードを生成します。 –

+0

質問コンパイラが特別なケースとして扱うこのような回答だと思いますが、少なくともGCCではこれはプライベートコンストラクタ 'initializer_list(T * arr、size_t len)'を伴います。 'std :: initializer_list'もコピー可能ですが、そうすることで配列はコピーされません。とにかく、基礎となる配列よりも存在すれば、その寿命は何とか管理されなければならない。 –

関連する問題