[英]Why does `std::sample` take `UniformRandomBitGenerator` as &&?
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()
以不同的方式使用它們。 只是對此背后的理由感到好奇。
sample
最終需要一個非常量生成器,但是允許臨時生成器傳入也非常方便,如果它通過非常量左值引用接收了生成器,則是不可能的。 顯而易見的解決方案:轉發引用,如果提供const lvalue,則不可避免的編譯器錯誤。
另一方面,我認為將臨時生成器傳遞給單個分發調用幾乎不會像往常一樣–實際上,考慮到構造/初始化大多數生成器的開銷,這樣做的絕大部分時間都是效率低下。 因此,例如std::vector
缺少push_front
和pop_front
,通過積極地使其成為反模式來阻止這種低效率可能是最好的做法。
按時間順序排列, <random>
明顯早於C ++ 11(它來自TR1,之前來自Boost),並且在集成到標准中時並沒有進行徹底的更新以利用新的語言功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.