Move semantics for D
monarch_dodra
monarch_dodra at gmail.com
Fri Jul 13 03:24:45 PDT 2012
On Friday, 13 July 2012 at 09:47:26 UTC, Jonathan M Davis wrote:
> On Friday, July 13, 2012 11:23:41 monarch_dodra wrote:
>> I think that in the case of your example, if "range" fulfills
>> the
>> requirements for (at least) an input range, then "save"
>> *should*
>> be called instead of "opSlice". I'm *think* this is what the
>> compiler does, but I'm not 100% sure.
>
> The compiler never calls save. It will call opSlice on
> non-ranges, but it'll
> never call save on anything. It doesn't even know that save
> exists. It's
> unnecessary for ranges which aren't reference types, and you
> already have to
> worry about calling save on ranges that could be reference
> types any time that
> you pass them to a function that you don't want to consume it,
> so it's not
> really a big deal to have to call save with foreach for such
> ranges. Most
> range-based functions don't even use foreach much anyway.
>
> - Jonathan M Davis
What exactly are the semantics of save? The reference in
std.range isn't very clear. It would appear it is only useful it
its *existence* that promotes a range from input to forward.
However, how is it different from a simple assignment?
Also, if you are supposed to call save before a foreach
"consumes" your range, then why does foreach even bother making a
copy of the range before iterating on it? Isn't this behavior
promoting dangerous usage for ranges where save is simply
"{return this;}", but bites you in the ass the day you use a
range with a specific save?
I'm confused...
More information about the Digitalmars-d
mailing list