2016-11-11 62 views
1

std::uniform_real_distribution::operator()是:爲什麼`std :: sample`採用'UniformRandomBitGenerator`作爲&&?

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()把他們在不同的方法。只是好奇這背後的理由。

回答

4
  1. sample最終需要一個非const發電機,但它也很方便,允許臨時發電機被傳入,這將是不可能的,如果它通過了非const左值參考發電機。顯而易見的解決方案:轉發引用,以及如果提供了常量左值,則不可避免的編譯器錯誤。

    另一方面,如果考慮到構建/初始化大多數發電機的費用,我認爲將臨時發電機通過一個分配調用–幾乎沒有像往常那樣,絕大多數時間這樣做會成爲效率低下的坑。有鑑於此,與例如std::vector缺少push_frontpop_front,通過積極地將其變爲反模式來阻止這種低效率可能是最好的做法。

  2. 按照時間順序,<random>明顯早於C++ 11(它來自TR1以及之前的Boost),並且在納入標準時未必全面更新以利用新的語言功能。

+0

對#1:我是不是要暗示的std :: uniform_real_distribution之間'任何關係::運算符()'和'sample'只是它們在標準庫兩個地內搭一臺發電機和他們不要以同樣的方式去做。 #2:我不反對,那爲什麼'std :: uniform_real_distribution :: operator()'也把它放在&&? – David

+0

好像只有上漲(更大的靈活性)才能使分配器以&&生成發送器 – David

+0

@David:答覆已更新。並同意;然而,改變分配方式需要努力,並且沒有人會爲改變而大聲疾呼,所以這項工作不太值得。畢竟,C++是一個志願者的努力。 ; - ] – ildjarn

相關問題