rvalue references
Diggory
diggsey at googlemail.com
Fri Apr 26 20:29:06 PDT 2013
> I don't see myself ever getting on board with this auto-ref
> idea. I just
> think it's crazy. It makes no sense to me, they are completely
> unrelated
> concepts. It will only lead to confusion.
>
> I'm back at scope-ref. Kenji is right as far as I'm concerned.
> Not to
> mention, he actually did the work.
> It makes perfect sense, and I can't see any reason why auto-ref
> should be
> used instead of something that actually makes intuitive sense,
> and people
> will eventually want to use anyway...
I'm against "scope ref" as the one thing "scope" means is that
the parameter cannot be returned, and preventing rvalue
references being returned breaks the one thing they are useful
for.
The primary use of rvalue references in C++ is so that these
three cases work:
vector<T> vec;
T t;
vec.push_back(T()) // Move semantics (temporary is destroyed in
the process)
vec.push_back(t) // Copy semantics ('t' is unmodified)
vec.push_back(move(t)) // Move semantics ('t' is destroyed in the
process)
This allows best efficiency (move is at least as fast as copy, so
when the original is no longer needed a move should be performed)
The way it works is that push_back() has two overloads:
push_back(T&& v) {
// Move 'v' into the vector, afterwards 'v' will have had its
guts ripped out so to speak...
}
push_back(const T& v) {
// Copy 'v' into the vector, 'v' is unmodified
}
- r-values such as 'T()' will default to the first overload.
- l-values such as 't' will default to the second overload.
- 'move(t)' returns an r-value causing the first overload to be
called.
As you can see, using "scope ref" will break this third case
because 'move()' won't be able to return an r-value, and if only
the first two cases are going to be possible, this can be done
without any special notion of r-value references anyway.
I'm starting to think there does need to be new syntax if all
three of the above cases are to be covered - it would work just
making "ref" accept rvalues but then "move" would be the default
for lvalues, and that would be confusing - but I don't think
using "scope" solves any problems, as the semantics required for
rvalues are orthogonal to what "scope" actually means.
As good as it is to avoid adding new keywords, I think this might
be a case where it's warranted...
More information about the Digitalmars-d
mailing list