繁体   English   中英

何时复制和交换习语不适用

[英]When is copy-and-swap idiom not applicable

看完有关的复制和交换成语我读过这个这下称(2):

class_name & class_name :: operator= ( const class_name & )     (2)     

(2)当不能使用复制和交换习语时,复制赋值运算符的典型声明

我们何时应该避免使用复制和交换习惯用法?

什么时候“完全不能使用”?

是否有现实生活中的情况,即复制和交换以及零规则都不适用?

我确实找到了这个问题,但它过于具体,没有包含任何关于如何识别此类案例的指南。

我们何时应该避免使用复制和交换习惯用法?

当你能证明天真的副本比swap更安全,更快。

当没有成员指针(既不是智能指针也不是原始指针)拥有对象时,您可以识别所有成员对象的情况。

什么时候“完全不能使用”?

当类型不可交换时,不能使用复制和交换

要进行交换,类型必须是可移动构造和可移动分配,或者您必须已定义swap成员函数或友元函数。

描述赋值运算符的潜在实现的链接将class_name& class_name::operator=(class_name)为:

可以使用复制和交换习惯用法时复制赋值运算符的典型声明

并且class_name& class_name::operator=(const class_name&) as:

当不能使用复制和交换习惯用法时,复制赋值运算符的典型声明

基本上我们总是希望在可能的情况下使用复制和交换,正如您在链接问题优秀答案中所提到的那样,因为它将通过自我指派测试。

所以现在问题是为什么会议在http://www.cppreference.com上提到了?

假设我正在为虚拟类实现一个复制构造函数,我想向任何继承他们应该使用复制和交换习惯用法的人说清楚。 我该怎么办? 我可以通过在初始调用中为他们复制来帮助他们:

class_name& class_name::operator=(class_name)

这是一个按值复制的,所以任何子类的实现者都会看到我已经为它们制作了副本,所以他们需要做的只是交换。

现在,如果我有一个包含无法复制构造的成员的class_name ,例如,如果我的类具有unique_ptr ,使其无法复制构造,该怎么办? 我可以指出, 通过赋值运算符的值参数进行复制,例如:

class_name& class_name::operator(const class_name&)

表明它将在任何子类的实现者上,以确保进行足够的检查以通过自我分配测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM