什么时候复制和交换习语不适用

When is copy-and-swap idiom not applicable

阅读 this about the copy-and-swap idiom I've read this 后 (2):

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

(2) Typical declaration of a copy assignment operator when copy-and-swap idiom cannot be used

我们什么时候应该避免使用复制和交换惯用语?

什么时候 "cannot be used" 一起?

现实生活中是否存在复制交换和零规则都不适用的情况?

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

When should we avoid using the copy-and-swap idiom ?

当你能证明 naïve copy 比 swap 安全且更快时。

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

And when it "cannot be used" altogether?

当类型不是 swappable.

时,不能使用复制和交换

要可交换,类型必须是可移动构造和可移动赋值的,或者您必须已经定义了一个 swap 成员函数或友元函数。

您的 link 描述了赋值运算符的潜在实现,class_name& class_name::operator=(class_name) 描述为:

Typical declaration of a copy assignment operator when copy-and-swap idiom can be used

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

Typical declaration of a copy assignment operator when copy-and-swap idiom cannot be used

基本上我们总是希望在可能的情况下使用复制和交换,如 excellent answer to your linked question 中所述,因为它会通过自赋值测试。

所以现在的问题是为什么http://www.cppreference.com上提到的约定?

假设我正在为虚拟 class 实现一个复制构造函数,并且我想向所有将要继承的人说明他们应该使用复制和交换习惯用法。我该怎么做?我可以通过在初次通话中为他们做副本来帮助他们:

class_name& class_name::operator=(class_name)

这是按值复制,因此任何子 classes 的实施者都会看到我已经为他们制作了副本,所以他们需要做的就是交换。

现在,如果我有一个 class_name 包含一个无法复制构造的成员,例如,如果我的 class 有一个 unique_ptr 怎么办复制构造的。我可以通过 not 将值参数复制到赋值运算符,例如:

class_name& class_name::operator(const class_name&)

表明它将在任何子 classes 的实施者身上,以确保完成足够的检查以通过自我分配测试。