簡體   English   中英

為什么`std :: sample`將`UniformRandomBitGenerator`當作&&?

[英]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 ,因為它是標准中的另一個生成器,並且samplestd::uniform_real_distribution::operator()以不同的方式使用它們。 只是對此背后的理由感到好奇。

  1. sample最終需要一個非常量生成器,但是允許臨時生成器傳入也非常方便,如果它通過非常量左值引用接收了生成器,則是不可能的。 顯而易見的解決方案:轉發引用,如果提供const lvalue,則不可避免的編譯器錯誤。

    另一方面,我認為將臨時生成器傳遞給單個分發調用幾乎不會像往常一樣–實際上,考慮到構造/初始化大多數生成器的開銷,這樣做的絕大部分時間都是效率低下。 因此,例如std::vector缺少push_frontpop_front ,通過積極地使其成為反模式來阻止這種低效率可能是最好的做法。

  2. 按時間順序排列, <random>明顯早於C ++ 11(它來自TR1,之前來自Boost),並且在集成到標准中時並沒有進行徹底的更新以利用新的語言功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM