在 C++11 中,初始化 a 似乎是合法的std::map<std::string, int>
,如下所示:
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
。
但是,我不确定我是否理解打字在这里的工作原理。如果我们去掉这里的变量声明并且只使用大括号括起来的初始化器,编译器就不会知道它正在查看 a,std::initializer_list<std::pair<std::string, int>>
因为它不知道大括号对表示std::pair
s。因此,似乎编译器以某种方式推迟了将类型分配给大括号封闭的初始值设定项的行为,直到它从std::map
构造函数中获得足够的类型信息以实现嵌套大括号用于对。我不记得在 C++03 中发生过这样的事情;据我所知,表达式的类型从不依赖于它的上下文。
哪些语言规则允许此代码正确编译并允许编译器确定用于初始化列表的类型?我希望得到具体参考 C++11 规范的答案,因为这真的很有趣!
谢谢!