簡體   English   中英

為什么std :: shuffle采用右值引用?

[英]Why does std::shuffle take an rvalue reference?

從C ++ 11開始std::shuffle()對隨機位生成器采用右值引用:

template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g);

所以我可以這么稱呼它:

std::vector<int> v = {...};
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);

這揭示了我對C ++的理解錯誤,我今天早上通過閱讀無法滿足:在這里使用右值引用可以獲得什么? 換句話說,為什么不這樣做

template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG& g);

這是轉發引用,而不是右值引用。 它們具有表面上相似的語法,但可以通過基本類型作為推導出的模板參數來區分。

如果為第三個參數給出了右值,則建議的替代方法將無法編譯,而轉發引用允許任何值類別的參數。

使用cppreference示例,這意味着您有兩個選項:

std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);

std::shuffle(v.begin(), v.end(), std::mt19937(rd()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM