代码之家  ›  专栏  ›  技术社区  ›  jma

为什么STD::洗牌需要一个价值参考?

  •  12
  • jma  · 技术社区  · 6 年前

    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);
    
    1 回复  |  直到 6 年前
        1
  •  17
  •   M.M    6 年前

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

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

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