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

can I call destructor in 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() 与 move 构造的对象一起使用?

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

关于你目前的实现,看来你可以做得更简单。我想象析构函数实际上删除了 _buffer 并且几乎没有做其他事情。如果那是真的,你应该用 delete _buffer.

替换你更难推理的显式析构函数调用

~VectorList 比 运行 dtor 主体中的代码做的更多:它实际上破坏了对象。

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

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

这两种方法都不值得。福利太少了。

更好的选择是复制交换(这至少很容易得到正确:它可以防止一些优化),或者从 dtor 和赋值中重构出 'clear' 代码。然后在两个点都调用它。