c++ - 析构函数是移动 ctor/assignment 的 RHS 上唯一调用过的东西吗?
问题描述
我的 search-fu 很好,但这很难正确地找到答案。基本上,在调用移动 ctor/assignment 之后,是否可以保证唯一会在 RHS 上调用的东西是析构函数?
我问的原因是我有各种各样的东西(为了理智起见)不能处于无效状态。但是,无论如何,最有效的移动方案是将一些东西换成 dtor 可以接受但没有其他东西可以接受的东西。否则,我必须分配实际数据,无论多么微不足道,以保持 RHS 处于有效状态。
如果 dtor 是唯一会被调用的东西,那么我可以获得最大的效率。
解决方案
是否保证唯一会在 RHS 上调用的东西是析构函数?
不。调用已移动对象的成员函数是格式正确的。该标准不保证程序员不会这样做。
作为类的实现者,您可以决定某些成员函数不得在已移动的对象上调用,从而可以避免例如分配内存。或者,您可以决定没有这样的要求。一般来说,有前置条件可以更有效地实现,而没有前置条件会使类更容易使用。
作为类的用户,您有责任遵循您调用的成员函数(或成员访问)的前提条件。如果函数的先决条件是该类未处于从状态移动的状态,则不要破坏该先决条件。
作为一般规则,允许在移动的对象上调用赋值运算符可能是一个很好的设计。这就是所有(可分配的)标准库类所做的。
简而言之:标准没有这样的保证,但是您可以将这样的要求强加给类的用户。只要确保它有据可查。
推荐阅读
- npm - 是什么导致 npm 包安装差异
- python - LSTM 模型的时间序列数据输入引发错误
- algorithm - 查找仅覆盖“空闲”像素的最大非重叠矩形序列
- asp.net-web-api - 作为中央微服务 ASP.NET 的身份验证和授权
- python - 如何编写一个 Django 查询,其中我的 WHERE 条件的左侧是一个数学表达式?
- python - 如何惩罚 DataFrame 中的空字段?
- php - 让wordpress忽略文件夹作为主题
- sas - 尝试在 SAS 中格式化字段,忽略小数
- javascript - 从反应客户端应用程序到 spring-boot 服务器的 HTTP POST 请求返回 400 错误
- java - Rest web services(post)消耗json不工作