std::map::insert C++17 中的变化
std::map::insert change in C++17
我看到 std::map
和 std::unordered_map
的 insert
方法将从
template<class P> std::pair<iterator,bool> insert(P&& value); (C++11)
到
std::pair<iterator,bool> insert(value_type&& value); (C++17)
但是,对于这些容器,value_type
是 std::pair<A const, int>
。这里有两个问题:
- 为什么会发生这种变化?好处是什么?
- 如何在插入时移动键? C++11 版本接受任何东西(对
P
的约束是 default_constructible<value_type, P&&>
),然后是 std::pair<A, int>
- 大多数时候这是这个参数的类型,因为它是std::make_pair
- 并且可以调用 A
的移动构造函数。但在 C++17 版本中,此参数被强制转换为 value_type
,其中 A
是 const,则不可移动。如果我没有忽略某些内容,则必须复制 A。或者 C++17 也改变了这方面的任何东西吗?
谢谢!
在 C++17 中添加了对 insert
的额外非模板重载。
这样的重载的优点是它允许 .insert( { {key}, {value, args} } )
语法——基于 {}
的构造。 template
参数无法传递 {}
没有显式类型的基于构造指令。
我看到 std::map
和 std::unordered_map
的 insert
方法将从
template<class P> std::pair<iterator,bool> insert(P&& value); (C++11)
到
std::pair<iterator,bool> insert(value_type&& value); (C++17)
但是,对于这些容器,value_type
是 std::pair<A const, int>
。这里有两个问题:
- 为什么会发生这种变化?好处是什么?
- 如何在插入时移动键? C++11 版本接受任何东西(对
P
的约束是default_constructible<value_type, P&&>
),然后是std::pair<A, int>
- 大多数时候这是这个参数的类型,因为它是std::make_pair
- 并且可以调用A
的移动构造函数。但在 C++17 版本中,此参数被强制转换为value_type
,其中A
是 const,则不可移动。如果我没有忽略某些内容,则必须复制 A。或者 C++17 也改变了这方面的任何东西吗?
谢谢!
在 C++17 中添加了对 insert
的额外非模板重载。
这样的重载的优点是它允许 .insert( { {key}, {value, args} } )
语法——基于 {}
的构造。 template
参数无法传递 {}
没有显式类型的基于构造指令。