shuffle and sample disallows lvalue URNGsSection: 26.7.12 [alg.random.sample], 26.7.13 [alg.random.shuffle] Status: C++17 Submitter: Tim Song Opened: 2016-05-24 Last modified: 2017-07-30
Priority: 0
View all issues with C++17 status.
Discussion:
std::shuffle and std::sample each accepts a UniformRandomNumberGenerator&& argument
and says that "UniformRandomNumberGenerator shall meet the requirements of a uniform random number generator
(29.5.3.3 [rand.req.urng]) type".
G satisfies the requirements of a uniform random
number generator if […]".
If an lvalue is passed, UniformRandomNumberGenerator is a reference type, not a class, and in fact expressions
like G::min() will not compile if G is a reference type.
[2016-06 Oulu]
Moved to P0/Ready during issues prioritization.
Friday: status to Immediate
Proposed resolution:
This wording is relative to N4582.
Edit 26.7.12 [alg.random.sample]/1 as indicated:
template<class PopulationIterator, class SampleIterator, class Distance, class UniformRandomNumberGenerator> SampleIterator sample(PopulationIterator first, PopulationIterator last, SampleIterator out, Distance n, UniformRandomNumberGenerator&& g);-1- Requires::
- […]
- (1.6) —
remove_reference_t<UniformRandomNumberGenerator>shall meet the requirements of a uniform random number generator type (26.6.1.3) whose return type is convertible toDistance.- […]
Edit 26.7.13 [alg.random.shuffle]/2 as indicated:
template<class RandomAccessIterator, class UniformRandomNumberGenerator> void shuffle(RandomAccessIterator first, RandomAccessIterator last, UniformRandomNumberGenerator&& g);-1- […]
-2- Requires:RandomAccessIteratorshall satisfy the requirements ofValueSwappable(17.6.3.2). The typeremove_reference_t<UniformRandomNumberGenerator>shall meet the requirements of a uniform random number generator (26.6.1.3) type whose return type is convertible toiterator_traits<RandomAccessIterator>::difference_type.