我正在尝试将一个只能移动的类型插入到一个映射中。我有以下代码:
#include <map>
class Moveable
{
public:
Moveable() = default;
Moveable(const Moveable&) = delete;
Moveable(Moveable&&) = default;
Moveable& operator=(const Moveable&) = delete;
Moveable& operator=(Moveable&&) = default;
};
int main() {
std::map<int,Moveable> my_map;
Moveable my_moveable_1, my_moveable_2, my_moveable_3;
my_map.insert(std::pair<int,Moveable>{1, std::move(my_moveable_1)}); // (1)
my_map.insert(std::make_pair(2, std::move(my_moveable_2))); // (2)
my_map.insert({3, std::move(my_moveable_3)}); // (3)
return 0;
}
使用VisualC++编译器,1、2、3行都能够成功编译。然而在clang和gcc编译器中,只有1、2行能够成功编译,第三行会出现错误(使用了已删除的复制构造函数)。
问题:哪个编译器是正确的?为什么?
请点击此处进行测试: rextester
my_map.emplace(3, std::move(my_moveable_3));
更有意义。 - super