首頁 > 後端開發 > C++ > C 11 標準函式庫函數中的自移動賦值有任何保證嗎?

C 11 標準函式庫函數中的自移動賦值有任何保證嗎?

DDD
發布: 2024-11-09 21:27:02
原創
330 人瀏覽過

Does Self-Move Assignment In C  11 Standard Library Functions Have Any Guarantees?

C 11 標準庫中的自移動分配

C 11 標準包含有關自移動分配的各種規定,特別是與標準結合使用圖書館。本文闡明了這些規定,重點在於函式庫函數中自移動賦值的意義。

具體來說,該標準保證當標準函式庫函數中的參數是右值引用參數時,實作可以假定其獨佔性。這意味著實作可以基於傳遞的物件不會被函數修改的理解來最佳化程式碼。

在自移動分配的脈絡中,這種保證有顯著的影響。例如,考慮以下函數:

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}
登入後複製

當傳遞左值時,將呼叫向量的複製建構函數,建立輸入向量的副本。然而,由於標準函式庫的保證,向量的移動賦值運算子的實作可以假設其參數是純右值。因此,自移動分配是不可行的,並且函數的行為取決於實作。

在大多數情況下,自移動分配使原始向量處於無資源狀態(0 容量) 。如果向量已經擁有 0 容量,則該操作變為空操作。然而,值得注意的是,在自移動分配後,原始向量和移動向量的狀態都未指定。

工作草案N4618 中標準的最新更新進一步澄清了這些規定,在MoveAssignable 中指定要求,其中將右值(rv) 分配給表達式(t),如果t 和rv 不引用同一對象,則t 只需在賦值之前取得rv 的值即可。不管這種情況如何,賦值後 rv 的狀態仍然未指定。

此外,註釋強調 rv 必須遵守使用它的函式庫元件的要求,無論 t 和 rv 是否引用同一物件。

以上是C 11 標準函式庫函數中的自移動賦值有任何保證嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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