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

时间:2018-06-18 05:13:14

标签: c++ c++11 rvalue

Since C++11std::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);

1 个答案:

答案 0 :(得分:17)

这是转发参考,而不是右值参考。它们具有表面上相似的语法,但可以通过基本类型作为推导出的模板参数进行区分。

如果为第三个参数给出了右值,则建议的替代方法不会编译,而转发引用允许任何值类别的参数。

使用cppreference示例,表示您同时拥有以下选项:

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

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