析构函数是移动ctor / assignment的RHS唯一需要调用的东西吗?

时间:2019-01-15 02:02:52

标签: c++ move-semantics

我的搜索词很好,但这是很难用正确的措词来找到答案的人。基本上,在调用move ctor / assignment之后,是否可以保证在RHS上唯一要调用的是析构函数?

我问的原因是(出于理智的考虑)我有各种各样的事情不能处于无效状态。但是,最有效的搬家方案是,在远处,将一些东西交换给他们,使干事可以接受,但是其他什么也做不到。否则,无论多么琐碎,我都必须分配实际数据,以使RHS保持有效状态。

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

2 个答案:

答案 0 :(得分:1)

  

是否可以保证在RHS上唯一要调用的是析构函数?

不。调用来自对象的成员函数的格式正确。该标准不能保证程序员不会这样做。

作为类的实现者,您可以确定某些成员函数一定不能在从对象移出的对象上调用,因此可以避免例如分配内存。或者,您可以决定不具有此类要求。通常,具有先决条件可以实现更有效的实现,而没有先决条件则使该类更易于使用。

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

通常,允许从对象移动调用赋值运算符可能是一个不错的设计。这就是所有(可分配的)标准库类的作用。


简而言之:标准没有这种保证,但是您可以将此类要求强加给类的用户。只要确保它有充分的记录即可。

答案 1 :(得分:0)

从物体上移走没有什么魔术。移动之后,该对象仍然有效,如果不是临时对象,您的代码可以调用该对象上的成员函数并将其传递给函数。

就像其他任何对象一样,这确实是问题的关键,编译器除了对对象进行生命周期的销毁外,不会对其进行任何处理。对于临时对象,这是创建对象的完整语句的结尾。对于命名对象,这就是创建对象的作用域的结尾。