在C 中,一個初始化器列表,表示為std::initializer_list
在下面的程式碼片段中,函數foo 接受一個初始化清單作為參數:
#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)); // Intended to move the element } }
出現這個問題是因為std::initializer_list
不幸的是,無縫元素移動的期望是沒有根據的。嘗試從初始值設定項清單中移動元素將產生意外結果。不是重新定位元素,而是建立副本。此行為源自於 std::initializer_list
因此,bar(std::move(*it)) 中使用的移動表達式綁定到 T 類型的函數參數const &,有效地保留了副本。
此限制的原因歸因於編譯器實例化的特權std::initializer_list 作為靜態初始化常數。允許從開始到結束的可變結果會阻礙這種最佳化,從而在編譯器的設計中引入複雜性。
儘管出現了意外的行為,但解決方案可能即將出現。 [ISO 提案](https://github.com/CaseyCarter/iso-changes/blob/master/icpp/p1716r4.md) 旨在引入對僅移動類型的初始值設定項清單支援。這項工作旨在增強語言的功能,並提供更一致的方法來處理初始化列表和移動語義。
以上是我們可以安全地從 C 中的 `std::initializer_list` 中移動元素嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!