首页 > 解决方案 > 析构函数是移动 ctor/assignment 的 RHS 上唯一调用过的东西吗?

问题描述

我的 search-fu 很好,但这很难正确地找到答案。基本上,在调用移动 ctor/assignment 之后,是否可以保证唯一会在 RHS 上调用的东西是析构函数?

我问的原因是我有各种各样的东西(为了理智起见)不能处于无效状态。但是,无论如何,最有效的移动方案是将一些东西换成 dtor 可以接受但没有其他东西可以接受的东西。否则,我必须分配实际数据,无论多么微不足道,以保持 RHS 处于有效状态。

如果 dtor 是唯一会被调用的东西,那么我可以获得最大的效率。

标签: c++move-semantics

解决方案


是否保证唯一会在 RHS 上调用的东西是析构函数?

不。调用已移动对象的成员函数是格式正确的。该标准不保证程序员不会这样做。

作为类的实现者,您可以决定某些成员函数不得在已移动的对象上调用,从而可以避免例如分配内存。或者,您可以决定没有这样的要求。一般来说,有前置条件可以更有效地实现,而没有前置条件会使类更容易使用。

作为类的用户,您有责任遵循您调用的成员函数(或成员访问)的前提条件。如果函数的先决条件是该类未处于从状态移动的状态,则不要破坏该先决条件。

作为一般规则,允许在移动的对象上调用赋值运算符可能是一个很好的设计。这就是所有(可分配的)标准库类所做的。


简而言之:标准没有这样的保证,但是您可以将这样的要求强加给类的用户。只要确保它有据可查。


推荐阅读