Andrei Alexandrescu wrote: > Philippe Sigaud wrote: >> On Thu, Dec 31, 2009 at 16:47, Michel Fortin <[email protected] >> <mailto:[email protected]>> wrote: >> >> On 2009-12-31 09:58:06 -0500, Andrei Alexandrescu >> <[email protected] >> <mailto:[email protected]>> said: >> >> The question of this post is the following: should output ranges >> be passed by value or by reference? ArrayAppender uses an extra >> indirection to work properly when passed by value. But if we >> want to model built-in arrays' operator ~=, we'd need to request >> that all output ranges be passed by reference. >> >> >> I think modeling built-in arrays is the way to go as it makes less >> things to learn. In fact, it makes it easier to learn ranges because >> you can begin by learning arrays, then transpose this knowledge to >> ranges which are more abstract and harder to grasp. >> >> >> I agree. And arrays may well be the most used range anyway. > > Upon more thinking, I'm leaning the other way. ~= is a quirk of arrays > motivated by practical necessity. I don't want to propagate that quirk > into ranges. The best output range is one that works properly when > passed by value.
I worry about a growing level of convention with ranges. Another recent range thread discussed the need to call consume after a successful call to startsWith. If I violated convention and had a range class, things would fail miserably. There would be no need to consume after a successful call to startsWith and the range would have a random number of elements removed on an unsuccessful call to startsWith. I'm pretty sure that early discussions of ranges claimed that they could be either structs and classes, but in practice that isn't the case.
