初始化清單和移動語意:我可以將元素移出嗎?
關於初始化清單和移動語意的使用出現一個問題:是是否允許將元素移出 std::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)); // kosher? } }
在這裡,我們想檢查是否可以將元素移出 std::initializer_list。
答案
令人驚訝的是,答案是否定的。表達式 std::move(*it) 不會導致移動。相反,它產生 T const && 類型的不可變右值引用。這是因為initializer_list的begin和end方法傳回const T *,這不允許移動語意。
這樣做的可能原因是使編譯器能夠將initializer_list建立為靜態初始化常數。然而,讓begin和end返回initializer_list或constinitializer_list會更直觀,取決於編譯器的判斷。
進一步的考慮因素
ISO提案已經為僅移動類型提供initializer_list支援。該提案雖然仍處於早期階段,但解決了此處提出的問題。
以上是可以將元素移出 std::initializer_list 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!