Also note that in a world with perfect forwarding, we shuold
probably specify fill() like
template< class Rng >
void fill( Rng&& rng, range_value<Rng>::type x );
Wouldn't this stop fill from working on ranges of abstract types?
I don't know. Usually when deal with abstract types, I don't use fill()
for anything because those types are not copyable or assignable.
I have infrequently have abstract types that are assignable. I don't think this alters your key point about the forwarding but I think we should probably have this instead:
template< class Range, class Value >
void fill( Rng&& rng, const Value& x );
Where 'Value' is required to be convertible to one of the right-hand side arguments of an assignment to a range_value<Rng>::type.
Does this look sensible to you?
Regards,
Neil Groves