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

c – 在析构函数和移动构造函数方面实现移动赋值

发布时间:2020-12-16 07:53:20 所属栏目:百科 来源:网络整理
导读:说我有一个管理内存的类,因此需要用户定义的特殊成员函数(想象向量或类似的). 考虑move-assignment操作符的以下实现: Class operator=(Class rhs){ this-~Class(); // call destructor new (this) Class(std::move(rhs)); // call move constructor in-plac
说我有一个管理内存的类,因此需要用户定义的特殊成员函数(想象向量或类似的).

考虑move-assignment操作符的以下实现:

Class& operator=(Class&& rhs)
{
    this->~Class();                    // call destructor
    new (this) Class(std::move(rhs));  // call move constructor in-place
}

>以这种方式实现移动赋值运算符是否有效?也就是说,以这种方式调用析构函数和构造函数不会违反语言中的任何对象生命周期规则?
>以这种方式实现移动赋值运算符是一个好主意吗?如果没有,为什么不,有更好的规范的方式?

解决方法

这是无效的:如果这个移动分配被调用作为移动子对象的一部分呢?然后你摧毁孩子(假设它有一个虚拟析构函数),并在其位置重新创建一个父对象.

我会说,即使在非虚拟的上下文中,仍然是一个坏主意,因为您不会经常看到语法,并且可能会使代码难以为以后的维护者所困扰.

最好的方法是避免必须完全使用自己的移动构造函数(并使用默认值),让所有的类成员都能够自己动手.例如依靠unique_ptr等.如果看起来似乎是根据交换(作为副本分配的副本和交换)实现它将是一个容易理解的机制.

(编辑:李大同)

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

    推荐文章
      热点阅读