我可以在移动赋值运算符中调用析构函数吗?

时间:2015-09-26 11:34:05

标签: c++ c++11 dry move-assignment-operator

在移动分配操作员内部调用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()与移动构造对象一起使用?

2 个答案:

答案 0 :(得分:5)

~VectorList不仅仅是在dtor体中运行代码:它实际上会破坏对象。

之后,存储空间未使用。您可以使用构造函数在那里构造一个新对象,但只是访问成员将是未定义的行为,或者需要语言律师找到允许它被定义的漏洞。

即使已定义,也很危险,因为在销毁自动存储对象时抛出的异常是坏消息。另外,如果指定的类实际上是派生类型,则dtor调用本身就是UB!

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

更好的选择是复制交换(至少容易纠正:它可以阻止一些优化),或者重构“清除”。来自dtor和赋值的代码。然后在两个地方打电话。

答案 1 :(得分:2)

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

关于您当前的实施,似乎您可以更简单地做到这一点。我认为析构函数实际上删除了_buffer而没有做其他事情。如果这是真的,那么你应该用delete _buffer替换你更难理解的显式析构函数。