我的 search-fu 很好,但很难用正确的短语找到答案。基本上,在调用 move 构造函数/赋值之后,是否可以保证在 RHS 上唯一会被调用的是析构函数?
我问的原因是我有很多东西(为了理智起见)不能处于无效状态。但是,最有效的 move 方案无疑是将一些 dtor 可以接受但其他任何东西都不能接受的东西交换到它们中。否则,我必须分配实际数据,无论多么微不足道,以保持 RHS 处于有效状态。
如果 dtor 是唯一会被调用的东西,那么我可以获得最高效率。
最佳答案
is it guaranteed that the only thing that will ever be called on the RHS will be the destructor?
没有。调用从对象移出的成员函数是良构的。该标准不保证程序员不会那样做。
作为类的实现者,您可以决定某些成员函数不得在从对象移出时调用,从而可以避免分配内存等。或者,您可以决定没有这样的要求。一般来说,有前置条件可以实现更高效的实现,而没有前置条件会使类更易于使用。
作为类的用户,您有责任遵守您调用(或成员访问)的成员函数的先决条件。如果函数的前提条件是类未处于 move 状态,则不要破坏该前提条件。
作为一般规则,允许对从对象移出的对象调用赋值运算符可能是一个很好的设计。这就是所有(可分配的)标准库类所做的。
简而言之:标准没有这样的保证,但是你可以把这样的要求强加给类的使用者。只要确保它有完整的文档即可。
关于c++ - 析构函数是唯一在 move 构造函数/赋值的 RHS 上调用过的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54191771/