これは、プログラマーとコンパイラーの間の一種の契約です。プログラマーが と言うと、コンパイラーはそれから、同じ要素のシーケンスを含む{1,2,3,4}
型のオブジェクトを作成します。initializer_list<int>
このコントラクトは、コンパイラの実装に対する言語仕様によって課される要件です。
つまり、そのようなオブジェクトを手動で作成するのはプログラマではなく、オブジェクトを作成し、そのオブジェクトをinitializer_list<int>
引数として取る関数に渡すのはコンパイラです。
実装はこのstd::vector
コントラクトを利用するinitializer_list<T>
ため、引数として受け取るコンストラクターを定義し、initializer-list の要素で自分自身を初期化できるようにします。
しばらくの間、引数として取るコンストラクターがないと仮定すると、次のようになりstd::vector
ます。std::initializer_list<T>
void f(std::initializer_list<int> const &items);
void g(std::vector<int> const &items);
f({1,2,3,4}); //okay
g({1,2,3,4}); //error (as per the assumption)
仮定によると、引数として受け取るstd::vector
コンストラクターがないため、コンパイラーはout のインスタンスを直接式から作成できないため、上記のように引数として渡すことができないことを意味します。これは、プログラマーとコンパイラーの間でそのような契約が作成されず、言語によって課されるためです。それを通して、表現から自分自身を創造することができます。std::initializer_list<T>
{1,2,3,4}
g()
std::vector
{1,2,3,4}
std::initializer_list
std::vector
{1,2,3,4}
std::initializer_list
の形式の式が必要な場合はどこでも を使用できることがわかります{value1, value2, ...., valueN}
。そのため、標準ライブラリの他のコンテナもstd::initializer_list
、引数として取るコンストラクタを定義しています。このように、 の形式の式から構築するために他のコンテナに依存するコンテナはありません{value1, value2, ...., valueN}
。
それが役立つことを願っています。