【发布时间】:2017-09-01 15:21:33
【问题描述】:
我正在尝试将没有复制构造函数的模板化类的实例插入到地图中。下面的代码不起作用,因为在emplace 函数中编译器想要调用复制构造函数。我不明白为什么,因为我从C++ reference 了解到 emplace 不会移动或复制:
小心使用 emplace 允许在构造新元素的同时 避免不必要的复制或移动操作。
这是我的代码:
#include <map>
#include <string>
template<typename T> class Class_a
{
public:
Class_a(T t1, T t2) : t1_(t1), t2_(t2) {}
~Class_a() {}
Class_a(const Class_a&) = delete;
Class_a& operator=(const Class_a&) = delete;
Class_a(Class_a&&) = delete;
private:
const T t1_;
const T t2_;
};
template<typename T>
using Class_a_map = std::map<std::string, Class_a<T>>;
int main()
{
Class_a_map<double> class_a_map;
std::string name = "test";
double number1 = 42;
double number2 = 43;
class_a_map.emplace(name, Class_a<double>(number1, number2));
return 0;
}
【问题讨论】:
-
为什么要让类不可移动?如果它是可移动但不可复制的,这将很好。
标签: c++ c++11 templates dictionary std