shuffle
and sample
disallows lvalue URNG
sSection: 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:RandomAccessIterator
shall 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
.