What if we did it so that transient ranges would have to define
transient property (as was previously proposed), and
isInputRange, isForwardRange and others would get an additional
parameter allowTransient. The default value of that argument
would be false, so those templates would evaluate to false for
transient ranges by default. Then algorithms that can work with
transient ranges would use
...
if(isInputRange!(R, true))
instead of
if(isInputRange!R)
The algorithms that don't support transient ranges would not
need to be changed. Wrapper ranges such as map's result would
define transient property if the wrapped range defines it.
Just to clarify, by "transient ranges would have to define
transient property" I meant just that this should be true for
transient ranges: is(typeof(R.transient)). So transient could
just be an enum. I didn't mean there would be a transient
property that would return a transient version of the range.