std::initializer_list
コア言語が組み込まれていないのはなぜですか?
これはC ++ 11の非常に重要な機能であり、独自の予約済みキーワード(または同様のもの)がないように思えます。
代わりに、initializer_list
それはだだけで、特別な、暗黙の持っている標準ライブラリのテンプレートクラスのマッピング新しいからブレース-のinit-リスト {...}
コンパイラによって処理の構文を。
最初は、このソリューションはかなりハックです。
これは、C ++言語への新しい追加が実装される方法ですか?コア言語ではなく、いくつかのテンプレートクラスの暗黙のロールによって?
これらの例を検討してください:
widget<int> w = {1,2,3}; //this is how we want to use a class
新しいクラスが選ばれた理由:
widget( std::initializer_list<T> init )
これらのアイデアのいずれかに類似したものを使用する代わりに:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- 古典的な配列、おそらく
const
あちこちに追加できます - 言語にはすでに3つのドット(var-args、現在は可変テンプレート)があります。構文を再利用してください(組み込みのように感じてください)。
- 既存のコンテナだけを追加して
const
、&
それらのすべてはすでに言語の一部です。私は最初の3つのアイデアを書いただけで、他にも多くのアプローチがあると確信しています。
std::array<T>
は「言語の一部」ではありませんstd::initializer_list<T>
。そして、これらは、言語が依存している唯一のライブラリコンポーネントではありません。参照new
/ delete
、type_info
、さまざまな例外タイプ、size_t
など
const T(*)[N]
ので、非常によく似ているどのように動作するかを、std::initializer_list
作品。