我正在使用没有任何复制操作符的Class(Object):它现在基本上无法复制.我有一个
std::map<int,Object> objects
列出具有int标识符的对象的变量.如何在不使用复制运算符的情况下将Object添加到此映射中?我试过了
objects.insert(std::pair<0,Object()>);
但那不会编译.我想最初使用默认构造函数在地图内部创建我的对象,但是写作
objects[0]; 失败...谢谢:)
在复制效率低下的情况下,移动语义替换复制语义.复制语义完全处理可复制对象,包括const对象.
在c ++ 11中已经存在无数的不可复制对象,例如std :: unique_ptr.这些对象完全依赖于移动语义,因为从对象移动允许使其无效.这对于像RAII这样的流行设计模式很重要(imho).
将const不可复制对象分配给内存区域时会出现问题.无法以任何方式恢复这样的对象.
这在对象的生命周期中显然很重要,因为它的常量.在它的生命周期结束时,当调用析构函数时,(不存在的)对象简单地是非常量的.
我建议移动析构函数可以成为移动语义模型的一个有价值的补充.
考虑一个简单的情况,其中unique_ptr用于unordered_set.您可以insert使用移动构造函数(或构造"emplace")进入此集合,但是如果您想将此指针移动到另一个unordered_set(即保持它为const),那么这将是不可能的.
必不可少的,有一个iterator insert((possibly const) key&&)但没有const key&& erase(iterator).事实上,这是不可能的.只能扩展容器以返回指向键的指针,并忘记它.
一个移动的析构函数可以解决这个问题const MyClass&& ~MyClass(),因为它只会在破坏期间违反const(当编译器认为对象无效时).
编辑:我应该指出const MyClass&& ~MyClass() const实际上更有意义.析构函数不必修改anyhting,只会破坏对象,就好像它不再是它控制的任何资源的有效句柄.