On 2010-01-01 17:54:12 -0500, Andrei Alexandrescu
<[email protected]> said:
Michel Fortin wrote:
What I'd do instead is somehow make input ranges non-copyable. They
could be either passed by ref or moved, never copied. This way they
would still behave exactly like array slices, only not copyable, and
you get a compile-time error if you try to copy them which is
infinitely better than a subtle change in behavior.
I tried that, it makes input ranges next to unusable.
I think I can see why. You can't have ref member and local variables
like in C++, so it's pretty hard to use references.
save() is an imperfect but workable solution.
save() is an workable but error-prone solution.
Perhaps we could mitigate this by making people more aware of the
difference instead. Couldn't we rename "input range" for "input stream"?
Currently you have ranges that behave one way and ranges that behave
the other way, which is confusing. Having a different name for both
would emphasize there is a difference. With different names, you're
guarantied to get the "what's the difference?" question from newbies.
And it's simple to explain: "You can often use ranges and streams
interchangeably, but for that to work you must use save() when you need
a copy of the current state. Also, not all streams support save(). It's
good practice to always use save() so that algorithms work for both for
ranges and streams."
--
Michel Fortin
[email protected]
http://michelf.com/