我正在玩C ++ 11,我找到了一种在地图中插入值的非常有用的方法(无序和/或多图):
map<unsigned, string> test;
test.insert({1, "abc"});
虽然这段代码正常运行(使用GCC 4.8或Clang 3.2编译),但我遇到了一些问题。 insert()
基本上有6个签名,我们感兴趣
1. pair<iterator,bool> insert (const value_type& val);
2. template <class P> pair<iterator,bool> insert (P&& val);
3. void insert (initializer_list<value_type> il);
前两个采用pair<const key_type,mapped_type>
类型对象,当最后一个采用列表时。所以,从理论上讲,代码
test.insert({1, "abc"});
正在使用第二个insert()
版本/签名,它使用C ++ 11统一初始化来构建对,因此将此对用作lvalue
。这可以“解释”为
test.insert(pair<const unsigned, string> {1, "abc"});
请注意,我们也可以
test.insert(pair<const unsigned, string>(1, "abc"));
或
test.insert(make_pair(1, "abc"));
但第一个版本似乎更自然。这种方法有一些重大问题吗?可能与列表初始化程序版本冲突?