C++11 では、std::map<std::string, int>
次のように a を初期化することは合法のようです。
std::map<std::string, int> myMap = {
{ "One", 1 },
{ "Two", 2 },
{ "Three", 3 }
};
直感的に、これは理にかなっています - 中括弧で囲まれたイニシャライザは、文字列のペアのリストであり、std::map<std::string, int>::value_type
(std::pair<std::string, int>
おそらくいくつかのconst
修飾付き.
ただし、ここでタイピングがどのように機能するかを理解しているかどうかはわかりません。ここで変数宣言を削除し、中括弧で囲まれた初期化子だけを使用すると、コンパイラは、中括弧で囲まれたstd::initializer_list<std::pair<std::string, int>>
ペアがstd::pair
s を表していることを認識できないため、a を見ていることを認識できません。したがって、コンパイラはstd::map
、ネストされた中括弧がペア用であることを認識するのに十分な型情報がコンストラクターから得られるまで、中括弧で囲まれた初期化子に型を割り当てる行為を何らかの形で延期しているように見えます。C++03 でこのようなことが起こったことを覚えていません。私の知る限り、式の型は文脈に依存することはありませんでした。
このコードが正しくコンパイルされ、コンパイラが初期化子リストに使用する型を決定できるようにする言語規則は何ですか? これが機能するのは本当に興味深いので、C++11仕様への特定の参照を含む回答を期待しています!
ありがとう!