为什么`std :: sample`将`UniformRandomBitGenerator`作为&&?

时间:2016-11-11 22:29:33

标签: c++ c++17

std::uniform_real_distribution::operator()是:

template< class Generator >
result_type operator()( Generator& g );

std::sample是:

template< class PopulationIterator, class SampleIterator,
          class Distance, class UniformRandomBitGenerator >
SampleIterator sample( PopulationIterator first, PopulationIterator last,
                       SampleIterator out, Distance n, 
                       UniformRandomBitGenerator&& g);

我这里仅引用uniform_real_distribution,因为它是标准中另一个采用生成器的位置,samplestd::uniform_real_distribution::operator()以不同的方式采用它们。只是好奇这背后的理由。

1 个答案:

答案 0 :(得分:4)

  1. sample最终需要一个非const生成器,但允许传入临时生成器也非常方便,如果它通过非const lvalue采用生成器,这是不可能的 - 参考。显而易见的解决方案:转发引用,如果提供了const值,则不可避免的编译器错误。

    另一方面,我认为将临时生成器传递给单个分发调用几乎不常见 - 实际上,考虑到构建/初始化大多数生成器的费用,绝大多数时间这样做将是一个效率低下的坑。从这个角度来看,如同std::vector缺少push_frontpop_front,通过积极地将其作为反模式来阻止这种低效率可能是最好的做法。

  2. 按时间顺序,<random>显着早于C ++ 11(它来自TR1,之前是Boost),并且在合并到标准中时未必彻底更新以利用新的语言功能。