[英]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.