On Wednesday, 29 March 2023 at 20:50:04 UTC, Steven Schveighoffer
wrote:
On 3/29/23 4:29 PM, ag0aep6g wrote:
But regardless of Salih's exact intent, the broader point is:
a non-ref overload could be added to Phobos. And that would
enable `a[1..$-1].phobos_put([2, 3])`. Which is what he asked
about originally.
I think the idea of requiring ref output ranges is that you can
then let the range keep track of its output state.
An input range with lvalue elements is therefore an output
range, but only if it's accepted via ref, since it has to be
iterated as it goes. If you iterate it only internally, then
it's either in an undetermined state when you exit `put`, or it
is a forward range that was copied without using `save`.
It's not the greatest situation. I feel like we probably
shouldn't have made lvalue input ranges be output ranges
automatically.
It should be fine to have both a `ref` and non-`ref` overload for
`put`, though, right? If the non-`ref` overload is only called
with rvalues, then it's fine to leave them in an undetermined
state, because nothing can access them afterward anyway.