我可以在移动赋值运算符中调用析构函数吗?
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' 代码。然后在两个点都调用它。
在移动赋值运算符中调用 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' 代码。然后在两个点都调用它。