请查看以下代码:
#include <utility>
#include <map>
// non-copyable but movable
struct non_copyable {
non_copyable() = default;
non_copyable(non_copyable&&) = default;
non_copyable& operator=(non_copyable&&) = default;
// you shall not copy
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
int main() {
std::map<int, non_copyable> map;
//map.insert({ 1, non_copyable() }); < FAILS
map.insert(std::make_pair(1, non_copyable()));
// ^ same and works
}
当在g++ 4.7取消注释标记行时,编译此片段将失败。产生的错误表明non_copyable
无法复制,但我预期它会被移动。
为什么使用统一初始化构造的std::pair
插入失败,而使用std::make_pair
构造的却没有?难道两者都应该生成可以成功移动到映射中的rvalue吗?
initializer_list<>
?std::pair<int, non_copyable>
似乎没有一个接受它的构造函数。我认为统一初始化语法只会选择pair<>
的常规构造函数。 - Andy Prowlmap
没有针对value_type &&
的insert
重载,而vector
却有。 - Kerrek SB