【问题标题】:Why does std::shuffle take an rvalue reference?为什么 std::shuffle 采用右值引用?
【发布时间】:2018-06-18 05:13:13
【问题描述】:

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

【问题讨论】:

  • 那不是转发引用吗?

标签: c++ c++11 rvalue


【解决方案1】:

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

如果为第三个参数提供了右值,您建议的替代方案将无法编译,而转发引用允许任何值类别的参数。

使用 cppreference 示例,这意味着您有以下两种选择:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2015-09-30
    • 2018-07-26
    相关资源
    最近更新 更多