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

可以將元素移出 std::initializer_list 嗎?

Patricia Arquette
Patricia Arquette原創
2024-12-26 00:49:09965瀏覽

Can You Move Elements Out of a std::initializer_list?

初始化清單和移動語意:我可以將元素移出嗎?

關於初始化清單和移動語意的使用出現一個問題:是是否允許將元素移出 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中文網其他相關文章!

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