可以在move赋值操作符中调用析构函数吗?

can I call destructor in move assignment operator?

本文关键字:调用 析构函数 赋值操作符 move      更新时间:2023-10-16

调用d-tor内部移动赋值操作符是好的做法吗?

下面是一些示例代码:

VectorList &operator = (VectorList &&other){
    ~VectorList(); // if this is not a good practice,
                   // I will need to paste whole d-tor here.
    _buffer     = std::move(other._buffer       );
    _dataCount  = std::move(other._dataCount    );
    _dataSize   = std::move(other._dataSize     );
    other._clear();
    return *this;
}

我应该使用这段代码,还是应该使用swap()与移动构造对象?

~VectorList不仅运行医生体中的代码:它实际上破坏了对象。

之后,存储空间未使用。你可以在那里使用构造函数构造一个新对象,但是简单地访问成员要么是未定义的行为,要么需要语言专家找到允许它被定义的漏洞。

即使定义了

,它也是危险的,因为在自动存储对象销毁时抛出异常是坏消息。另外,如果被赋值的类实际上是派生类型的,那么医生调用本身就是UB!

这两种方法都不值得。好处太少了。

更好的选择是拷贝交换(这至少很容易得到正确的:它可以防止一些优化),或者重构从博士和赋值中"清除"代码。

Scott Meyers说不要使用swap(): http://scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html

关于你目前的实现,似乎你可以做得更简单。我想象析构函数实际上删除了_buffer,并没有做任何其他事情。如果这是真的,您应该用delete _buffer替换您的难以解释的显式析构函数调用。