加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:59:25 所属栏目:百科 来源:网络整理
导读:在移动分配运算符里面调用一个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 ); _dat
在移动分配运算符里面调用一个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”代码.然后在两个地方打电话给它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读