必须将不可复制类的实例填充到映射中。例如下面的代码:
#include <map>
class NoCopyClass
{
public:
NoCopyClass() {};
NoCopyClass(int value) {};
NoCopyClass& operator=(const NoCopyClass&) = delete;
};
int main()
{
std::map<int, NoCopyClass> my_map;
my_map[3] = NoCopyClass(20);
}
除非您注释掉复制构造函数的删除,否则它将无法编译。您可以在这里尝试:https://onlinegdb.com/ByBh0NubU
当类不可复制时添加新地图元素的正确方法是什么?
非常感谢!
尝试使用emplace()
来就地构造对象,而不是复制已经构造的对象:
emplace()
尝试一下:
int main()
{
std::map<int, NoCopyClass> my_map;
my_map.emplace(3, 20);
}
签出#include <map>
class NoCopyClass {
public:
NoCopyClass() {};
NoCopyClass(int value) {};
NoCopyClass& operator=(const NoCopyClass&) = delete;
};
int main() {
std::map<int, NoCopyClass> my_map;
my_map.insert(std::make_pair(3, 30));
// or
my_map.emplace(std::make_pair(4, 40));
// or
my_map.emplace(5, 50);
// or
my_map.emplace(std::piecewise_construct,
std::forward_as_tuple(6),
std::forward_as_tuple(60));
// or (from C++17)
my_map.try_emplace(7, 70);
return 0;
}
选项:
std::pair
的转换移动构造函数std::pair
的模板构造函数std::pair
的分段构造函数std::pair
,不同之处在于该元素被构造为value_type