首頁 >後端開發 >C++ >元素可以移出'std::initializer_list”嗎?

元素可以移出'std::initializer_list”嗎?

DDD
DDD原創
2024-12-20 14:10:14519瀏覽

Can Elements Be Moved Out of a `std::initializer_list`?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn