2016-11-11 3 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 здесь, потому что это еще одно место в стандарте, который принимает генератор и sample и std::uniform_real_distribution::operator() взять их в разные пути. Просто любопытно об этом.

ответ

4
  1. sample в конечном счете необходим неконстантный генератор, но это также очень удобно, чтобы временные генераторы должны быть переданы в, которое не было бы возможно, если он взял генератор по неконстантному Lvalue ссылке. Очевидное решение: ссылка на пересылку и неизбежная ошибка компилятора, если предоставляется константа lvalue.

    С другой стороны, я полагаю, что почти не будет, как обычно, передавать временный генератор одному вызову распределения –, учитывая затраты на создание/инициализацию большинства генераторов, причем большая часть времени, быть ямой неэффективности. В этом свете, как, например, std::vector недостаток push_front и pop_front, что обескураживает эту неэффективность, активно делая ее анти-шаблоном, вероятно, лучше всего делать.

  2. Хронологически, <random> значительно предшествует C++ 11 (он исходит от TR1 и Boost до этого), и не обязательно был полностью обновлен, чтобы использовать новые языковые функции при включении в стандарт.

+0

на # 1: Я не пытался подразумевать какое-либо отношение между 'станд :: uniform_real_distribution :: оператор()' и 'sample' кроме них есть два места в стандартной библиотеке, которые принимают генератор, и они не делайте этого таким же образом. на # 2: я не согласен, так почему же 'std :: uniform_real_distribution :: operator()' также взять его на &&? – David

+0

кажется, что есть только потенциал роста (большая гибкость), чтобы распределения принимали генераторы по &&, а также – David

+0

@David: ответ обновлен. И согласился; тем не менее, изменение распределений требует работы, и никто не требует от упомянутых изменений, поэтому работа вряд ли считается достойной усилий. В конце концов, C++ - это добровольческая работа. ; -] – ildjarn

Смежные вопросы