首頁 > 後端開發 > C++ > 可以從 C `initializer_list` 中移動元素嗎?

可以從 C `initializer_list` 中移動元素嗎?

Barbara Streisand
發布: 2024-12-18 17:14:14
原創
873 人瀏覽過

Can Elements Be Moved from a C   `initializer_list`?

移動語意與initializer_list

在C中,一個initializer_list;是 T 類型值的暫時序列。它通常用於初始化數組和其他容器。然而,出現了一個問題:可以將元素移出initializer_list嗎?

考慮以下程式碼片段:

#include <initializer_list>
#include <utility>

template<typename T>
void foo(std::initializer_list<T> list)
{
    for (auto it = list.begin(); it != list.end(); ++it)
    {
        bar(std::move(*it));   // Allowable?
    }
}
登入後複製

答案:

不幸的是,將元素移出initializer_list不會如預期行事。儘管預期initializer_list將保存臨時數組直到它們被移動,但它仍然會產生副本。

這個偏差源自於以下事實:initializer_list::begin() 和initializer_list 。 ::end() 傳回 const T *。所提供程式碼中的 move 結果產生一個 T const & &&,它表示一個不可變的右值參考。這樣的表情是無法移開的。它綁定到 T const & 類型的函數參數,因為右值綁定到 const 左值引用,導致保留複製語義。

此限制背後的原因可能是允許編譯器初始化initializer_list ;靜態地。然而,可以透過允許編譯器將類型定義為initializer_list來改進該方法。或 constinitializer_list,從而消除了使用者對 begin() 和 end() 結果的 const 或可變性質的歧義。

儘管如此,已經提出了對 C 標準的擬議擴展解決此限制並允許initializer_list支援僅移動類型。雖然它仍處於開發的早期階段,但建議未來進一步探索和採用此功能。

以上是可以從 C `initializer_list` 中移動元素嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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