【发布时间】:2014-01-31 20:54:16
【问题描述】:
在复制效率低下的情况下,移动语义取代了复制语义。复制语义完全处理可复制对象,包括 const 对象。
c++11 中已经存在无数不可复制的对象,例如 std::unique_ptr。这些对象完全依赖于移动语义,因为从一个对象移动允许使其无效。这对于像 RAII 这样的流行设计模式很重要(恕我直言)。
将 const 不可复制对象分配给内存区域时会出现问题。这样的对象无法以任何方式恢复。
这在对象的生命周期中显然很重要,因为它是常量。然而,在它的生命周期结束时,当调用析构函数时,(不存在的)对象是短暂的非常量。
我建议 moving 析构函数可能是移动语义模型的一个有价值的补充。
考虑一个在 unordered_set 中使用 unique_ptr 的简单情况。您可以使用移动构造函数(或构造“emplace”)将insert 放入此集合,但是如果您想将此指针移动到另一个 unordered_set(即保持它为常量),这是不可能的。
必不可少,有iterator insert((possibly const) key&&),但没有const key&& erase(iterator)。事实上这是不可能的。容器只能被扩展为返回一些指向键的指针,然后忘记它。
一个移动的析构函数可以解决这个问题,即const MyClass&& ~MyClass(),因为它只会在析构过程中违反 const(当编译器认为对象仍然无效时)。
编辑:我应该指出const MyClass&& ~MyClass() const 实际上更有意义。析构函数不必修改任何内容,只需将对象销毁,就好像它不再是它所控制的任何资源的有效句柄一样。
【问题讨论】:
-
Const 对象在构造过程中也不是
const。 -
更合适的论坛将是此页面上的前 2 个论坛之一:isocpp.org/forums
-
基本上它只会复制它需要的东西(这就是移动在c ++ 11中的意思)到一个新对象中,然后像正常移动一样销毁旧对象,但是发生但是对于非临时工
-
@BenjaminLindley 是的,我想我不想讨论“不可能”或“类似于这个提议”
-
@BenjaminLindley 我在别处发布了这个问题,时间会证明这里是否有人想删除它,或者回答它(或者,你知道,赞成它..)
标签: c++ c++11 language-features move-semantics