首頁 > 後端開發 > C++ > 移動賦值運算子中的「if (this != &rhs)」檢查是否必要?

移動賦值運算子中的「if (this != &rhs)」檢查是否必要?

DDD
發布: 2024-11-28 00:33:11
原創
211 人瀏覽過

Is the `if (this != &rhs)` Check Necessary in a Move Assignment Operator?

移動賦值運算子和if (this != &rhs)

在類別的標準複製賦值運算子中,通常的做法是檢查分配的物件是否是與呼叫物件相同,使用if (this != &rhs) 以避免更改呼叫物件。但是,這種檢查對於移動賦值運算子來說是必要的嗎?

移動語意

移動賦值運算符,由operator=(Class&&)表示,旨在有效地轉移資源的所有權從一個物體到另一個物體。與副本分配不同,它避免了創建物件的新副本的需要。

情況分析

這個可以== &rhs嗎?

問題出現了,在移動分配中== &rhs 是否可以為真

物件綁定到右值引用有兩種情況:

  1. 它是一個實際的臨時物件。
  2. 它是呼叫者假裝的一個物件是一個臨時物件。

第一種情況,因為該物件是臨時物件的唯一引用,這 == &rhs 是不可能的。在第二種情況下,呼叫者有責任確保 this != &rhs,從而使檢查變得不必要。

不檢查的論證

作者認為 if (this != &rhs) 檢查是多餘的,因為:

  • 臨時變數的自我分配是不可能。
  • 故意欺騙操作員的客戶應該修復他們的程式碼。

省略此檢查,可以在物件頻繁從自身移出和分配給自己的情況下提高效能。

檢查論證

然而,有些人認為 this != &rhs檢查仍然是必要的,以防止自我移動分配。他們認為允許 swap(x, x) 作為有效操作可能會觸發此檢查。

解決方案與注意事項

作者的結論是:

複製並移動分配後置條件:

  • 複製賦值: y的值應保持不變,包括自複製賦值的情況。
  • 移動賦值: y 應該具有有效但未指定的狀態,包括 self -移動分配。

自移動分配實作:

為了實現這一點,提供了像dumb_array 這樣的類別中移動賦值運算子的三種可能的實作:

1.執行檢查以區分self-move-assignment,先前物件被設定為有效狀態

2. 忽略簽入,使自移動分配成為無操作。

3. 交換(其他) ) 方法被使用,前提是該類別不持有應立即釋放的資源。

作者強調,最好的實作取決於特定的類別設計、硬體特性和效能要求。

如果類別不直接管理內存,建議使用operator=(Class& &) = 預設值;在基本異常安全的情況下實現最高效能。

以上是移動賦值運算子中的「if (this != &rhs)」檢查是否必要?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板