为什么 std::shuffle 采用右值引用?
Why does std::shuffle take an rvalue reference?
Since 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()));
Since 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()));