gpt4 book ai didi

c++ - 为什么 std::shuffle 采用右值引用?

转载 作者:IT老高 更新时间:2023-10-28 23:15:01 26 4
gpt4 key购买 nike

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()));

关于c++ - 为什么 std::shuffle 采用右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50902997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com