c++ - 析构函数是唯一在 move 构造函数/赋值的 RHS 上调用过的东西吗?

标签 c++ move-semantics

我的 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/

相关文章:

c++ - move 语义 - 它是关于什么的?

c++ - 为什么包含 std::stringstream 的类的 move 语义会导致编译器错误?

c++ - Boost.Test 崩溃并出现 ***Exception : Other on MSVC

c++ - DirectShow 过滤器图在某些机器上永远不会完成

c++ - C++ 世界中是否有特定于线程的时钟?

C++ 阶乘程序为任何大于 2 的数给出无穷大

c++ - cmake 使用 find_package 传播依赖项

c++ - 为什么 std::move 采用 forward_reference 而不是 lvaue 引用

c++ - 在 move 构造函数中用作 arg 后,哪些 std 类型保证为空/空

c++ - 为什么以这种方式使用 move 语义无效?