C++0x のいくつかの新機能に少し興味があります。特に、範囲ベースの for ループと初期化リスト。両方の機能が正しく機能するには、ユーザー定義のクラスが必要です。
私はこの投稿に出くわしましたが、トップアンサーは役に立ちました。それが完全に正しいかどうかはわかりません(おそらく完全に誤解しているだけです。最初の回答の3番目のコメントを参照してください)。初期化子リストの現在の仕様によると、ヘッダーは 1 つの型を定義します。
template<class E> class initializer_list {
public:
initializer_list();
size_t size() const; // number of elements
const E* begin() const; // first element
const E* end() const; // one past the last element
};
これは仕様で確認できます。 Ctrl + F 'class initializer_list'だけです。
= {1,2,3}
をクラスに暗黙的にキャストするためinitializer_list
に、コンパイラは と の間の関係について何らかの知識を持っている必要が{}
ありinitializer_list
ます。何かを受け取るコンストラクターはないため、initializer_list は、コンパイラーが実際に生成しているものにバインドされるラッパーです。
これはループと同じでfor( : )
、ユーザー定義型が機能する必要があります (ただし、仕様によると、配列と初期化子リストのコードを必要としないように更新されています。しかし、初期化子リストには が必要な<initializer_list>
ので、ユーザー定義コードの要件です。プロキシー)。
ここでこれがどのように機能するかを完全に誤解していますか? これらの新機能がユーザー コードに非常に大きく依存していると考えるのは間違いではありません。機能が中途半端で、機能全体をコンパイラに組み込むのではなく、コンパイラによって半分が行われ、インクルードで半分が行われているように感じます。これの理由は何ですか?
編集:「ユーザーコードに大きく依存する」ではなく、「コンパイラコードに大きく依存する」と入力しました。これは私の質問を完全に放棄したと思います。私が混乱しているのは、コンパイラに組み込まれている新機能に関するものではなく、ユーザー コードに依存するコンパイラに組み込まれているものです。