3

我在玩 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"));

但第一个版本似乎更自然。这种方法有一些主要问题吗?与列表初始值设定项版本可能存在冲突?

4

0 回答 0