C++11 使用新的初始化列表语法在地图中插入项目

C++11 使用新的初始化列表语法在地图中插入项目,c++11,map,insert,initializer-list,C++11,Map,Insert,Initializer List,我在玩C++11时,发现了一种在映射(无序和/或多重映射)中插入值的非常有用的方法: 前两个获取一个对类型对象,而最后一个获取一个then列表。因此,理论上,代码 test.insert({1, "abc"}); 正在使用第二个insert()version/signature,其中它使用C++11统一初始化来构建该对,因此将该对用作lvalue。这可以“解释”为 但第一个版本似乎更自然。这种方法有什么大问题吗?与列表初始值设定项版本可能存在冲突?使用test.emplace(1,“abc”)

我在玩C++11时,发现了一种在映射(无序和/或多重映射)中插入值的非常有用的方法:

前两个获取一个
类型对象,而最后一个获取一个then列表。因此,理论上,代码

test.insert({1, "abc"});
正在使用第二个
insert()
version/signature,其中它使用C++11统一初始化来构建该对,因此将该对用作
lvalue
。这可以“解释”为


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

使用
test.emplace(1,“abc”)更容易。它应该在初始代码中使用第一个版本的
insert
。第二个版本甚至不能用大括号的init列表调用。@Johanneschaub litb事实上,第二个“版本”已经为G++4.8和Clang++3.2编译好了,对我来说效果很好。我的主要问题是版本2和版本3之间可能存在冲突。@KennyTM我完全错过了
emplace()。事实上,它更简单、更清晰,而且,IHO,更不容易出错。谢谢@如果2和3之间存在冲突,我建议向他们发送错误报告。
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);
test.insert({1, "abc"});
test.insert(pair<const unsigned, string> {1, "abc"});
test.insert(pair<const unsigned, string>(1, "abc"));
test.insert(make_pair(1, "abc"));