为什么"std::sample"将"UniformRandomBitGenerator"作为&&?
Why does `std::sample` take `UniformRandomBitGenerator` as &&?
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
,因为它是标准中另一个使用生成器的地方,sample
和std::uniform_real_distribution::operator()
以不同的方式使用它们。我只是好奇这背后的原理。
-
sample
最终需要一个非const生成器,但是允许传入临时生成器也非常方便,如果它通过非const左值引用获取生成器,这将是不可能的。显而易见的解决方案是:转发引用,如果提供了const左值,则不可避免地会出现编译错误。另一方面,我认为将临时生成器传递给单个分布调用–实际上,考虑到构造/初始化大多数生成器的费用,绝大多数时候这样做会导致效率低下。从这个角度来看,就像
std::vector
缺少push_front
和pop_front
一样,通过积极地使其成为反模式来阻止这种低效率可能是最好的办法。 -
按时间顺序,
<random>
明显早于c++ 11(它来自TR1,以及在那之前的Boost),并且在纳入标准时不一定彻底更新以利用新的语言特性。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将Ref对象作为类成员
- 虚拟决赛作为安全
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 使用指向成员的指针将成员函数作为参数传递
- 我应该使用什么来代替void作为变体中的替代类型之一
- 何时提供默认参数作为模板参数
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- C++匿名结构作为std::映射值
- C++:如何使函数只返回作为列表一部分的字符串
- 如何制作一个将函数作为参数的类方法
- 如何在C++中使用非静态成员函数作为回调函数
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- 函数作为模板参数,是否对返回类型强制约束
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- 为什么 Clang 不允许"and"作为函数名称?
- 为什么 std::function 可以作为 std::not2 的参数?