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

Why does `std::sample` take `UniformRandomBitGenerator` as &&?

本文关键字:作为 UniformRandomBitGenerator sample std 为什么      更新时间:2023-10-16

std::uniform_real_distribution::operator() is:

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. sample最终需要一个非const生成器,但是允许传入临时生成器也非常方便,如果它通过非const左值引用获取生成器,这将是不可能的。显而易见的解决方案是:转发引用,如果提供了const左值,则不可避免地会出现编译错误。

    另一方面,我认为将临时生成器传递给单个分布调用–实际上,考虑到构造/初始化大多数生成器的费用,绝大多数时候这样做会导致效率低下。从这个角度来看,就像std::vector缺少push_frontpop_front一样,通过积极地使其成为反模式来阻止这种低效率可能是最好的办法。

  2. 按时间顺序,<random>明显早于c++ 11(它来自TR1,以及在那之前的Boost),并且在纳入标准时不一定彻底更新以利用新的语言特性。