[英]Why can I move an object with deleted move constructor and assignment operator?
[英]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()与移动构造对象?
~VectorList
不仅运行dtor体中的代码:它实际上会破坏对象。
之后,存储空间未使用。 您可以使用构造函数在那里构造一个新对象,但只是访问成员将是未定义的行为,或者需要语言律师找到允许它被定义的漏洞。
即使被定义,它也是危险的,因为在销毁自动存储对象时抛出的异常是坏消息。 另外,如果指定的类实际上是派生类型,则dtor调用本身就是UB!
这两种方法都不值得。 好处太小了。
更好的选择是copy-swap(至少很容易纠正:它可以阻止一些优化),或者从dtor和赋值中重构出“clear”代码。 然后在两个地方打电话给它。
Scott Meyers说不要使用swap()
: http : //scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html
关于您当前的实施,似乎您可以更简单地做到这一点。 我想析构函数实际上删除了_buffer
并且没有其他功能。 如果这是真的,你应该用delete _buffer
替换你更难delete _buffer
显式析构函数调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.