initializer_list 和移動語義
C 中的initializer_list 類型通常用於初始化帶有大括號括號的值列表的容器。但是,與常規容器不同,initializer_list 不遵循值語義。因此,出現了一個常見的問題:
元素可以從 std::initializer_list
這個問題的答案是否定的。即使正在移動的元素屬於僅移動類型,嘗試這樣做也會產生副本。這是因為initializer_list 的begin() 和end() 函數傳回指向const 值的指標。當 std::move 應用於 const 值時,結果是一個不可變的右值引用,無法對其進行有意義的移動。相反,它將綁定到 const T& 類型的函數參數,從而產生複製語義。
考慮到initializer_list 旨在儲存臨時物件列表,這種行為可能看起來出乎意料。然而,據信,由編譯器自行決定使類型為 const 或 mutable 將允許更有效地靜態初始化清單。
更新:關於僅移動類型的initializer_list 支援的提案
為了回應回饋,已經起草了一份ISO 提案來為初始化器列表中的僅移動類型提供支援。該提案仍在審查中,但它為當前使用僅移動類型時initializer_list 的限制提供了潛在的解決方案。
以上是元素可以移出'std::initializer_list”嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!