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
,因为它是标准中另一个采用生成器的位置,sample
和std::uniform_real_distribution::operator()
以不同的方式采用它们。只是好奇这背后的理由。
答案 0 :(得分:4)
sample
最终需要一个非const生成器,但允许传入临时生成器也非常方便,如果它通过非const lvalue采用生成器,这是不可能的 - 参考。显而易见的解决方案:转发引用,如果提供了const值,则不可避免的编译器错误。
另一方面,我认为将临时生成器传递给单个分发调用几乎不常见 - 实际上,考虑到构建/初始化大多数生成器的费用,绝大多数时间这样做将是一个效率低下的坑。从这个角度来看,如同std::vector
缺少push_front
和pop_front
,通过积极地将其作为反模式来阻止这种低效率可能是最好的做法。
按时间顺序,<random>
显着早于C ++ 11(它来自TR1,之前是Boost),并且在合并到标准中时未必彻底更新以利用新的语言功能。