相关疑难解决方法(0)

是否可以在没有任何复制操作符的类中使用C++中的std :: map?

我正在使用没有任何复制操作符的Class(Object):它现在基本上无法复制.我有一个

std::map<int,Object> objects

列出具有int标识符的对象的变量.如何在不使用复制运算符的情况下将Object添加到此映射中?我试过了

objects.insert(std::pair<0,Object()>);

但那不会编译.我想最初使用默认构造函数在地图内部创建我的对象,但是写作

objects[0]; 失败...谢谢:)

c++ constructor stdmap copy-constructor

13
推荐指数
2
解决办法
1万
查看次数

移动语义是不完整的?

在复制效率低下的情况下,移动语义替换复制语义.复制语义完全处理可复制对象,包括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,只会破坏对象,就好像它不再是它控制的任何资源的有效句柄.

c++ language-features move-semantics c++11

10
推荐指数
1
解决办法
795
查看次数