簡體   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