C++中怎么让让移动操作对自赋值安全

发布时间:2021-11-29 13:40:52 作者:iii
来源:亿速云 阅读:125

本篇内容主要讲解“C++中怎么让让移动操作对自赋值安全”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中怎么让让移动操作对自赋值安全”吧!

C.65:让移动操作对自赋值安全   
Reason(原因)

如果x=x改变了x的值,人们会感到诧异而且有可能发生严重的错误。虽然人们一般不会直接在移动操作中使用自赋值,它还是会发生。但是由于std::swap被实现为使用移动操作,如果你意外地调用了swap(a,b)而a和b参照了同一个对象,如果没有处理好自赋值的话,可能会发生严重且不易发现的错误。   

Example(示例)
class Foo {
   string s;
   int i;
public:
   Foo& operator=(Foo&& a);
   // ...
};

Foo& Foo::operator=(Foo&& a) noexcept  // OK, but there is a cost
{
   if (this == &a) return *this;  // this line is redundant
   s = std::move(a.s);
   i = a.i;
   return *this;
}

违反自我赋值检查的概率只有百万分之一(数据只要领会精神就好,译者注);避免自我赋值的讨论和自我移动的关系更加密切。

Note(注意)

没有避免使用if(this==&a)return *this;操作的普遍办法。检查移动赋值的方法仍然会得出正确的结果(例如在x=x之后x的值不会改变)。

Note(注意)

ISO标准只为标准库容易保证了一个“合法但未定义”的状态。看起来在10多年的经验和产品应用中没有成为问题。如果你遇到了反例请联系编辑。本规则更为谨慎并坚持做到完全安全。 

Example(示例)

这里有一个不检查就移动指针的方法(将其想象为实现移动赋值代码中的一部分):

// move from other.ptr to this->ptr
T* temp = other.ptr;
other.ptr = nullptr;
delete ptr;
ptr = temp;
   

译者注

如果other和this是同一个对象,other.ptr=nullptr也会同时将this.ptr置空,导致下面的delete ptr不起作用。这样就保证了自我移动时的安全。

这种做法太难理解了。  

Enforcement(示例)

到此,相信大家对“C++中怎么让让移动操作对自赋值安全”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 赋值兼容规则(C++)
  2. 关于企业移动设备安全建议

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:选择云计算数据库的正确方法是什么

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》