我在玩 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>
类型对象,而最后一个采用 then 的列表。所以,理论上,代码
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"));
但第一个版本似乎更自然。这种方法有一些主要问题吗?与列表初始值设定项版本可能存在冲突?