Re: rvalue reference questions
on Wed Dec 10 2008, derek-AT-antiquark.com wrote:
Hello,
I'm reading about rvalue references, and not really "getting" them.
Something that would aid my understanding greatly would be to learn
about how rvalue references would be converted to a lower level, like C
++.
So, are the following statements correct regarding rvalue references:
The compiler will convert the following code:
double && x = sqrt(123);
cout << x << endl;
to
cout << sqrt(123) << endl;
In other words, 'x' is used as a placeholder for the actual function
sqrt call.
No, not quite. In
cout << sqrt(123) << endl;
the expression "sqrt(123)," if it returns by-value, yields an rvalue.
In
cout << x << endl;
you are dealing with a named entity, 'x'. Named entities are always
lvalues (that's right: even if they're rvalue references).
It's actually possible for C++ code today to distinguish non-const
rvalues from lvalues. For example,
struct catchall
{
template <class T>
catchall(T const&);
};
template <class T>
int f(T&); // called for lvalues and const rvalues
char* f(catchall); // called for non-const rvalues
so
f(sqrt(123))
and
f(x)
would have different results.
Given the function:
void PrintIfGtZero(double && x)
{
if(x > 0) cout << x << endl;
}
...
PrintIfGtZero(sqrt(123));
The compiler will convert the code to:
{
if(sqrt(123))cout << sqrt(123) << endl;
}
No,
Does this mean that sqrt(123) is called twice?
and no. Don't think of rvalue references in terms of code conversion;
it will just get you into trouble. Think of them as regular C++
references with different binding rules and a quirky type-deduction
feature that allows perfect forwarding.
Is is possible that an rvalue reference argument might not be called?
I think if you've understood me up to now, you won't need that question
answered, but just to be clear: arguments are never "called," except in
cases like this one:
int f(int(*g)())
{
return g();
// here-^^
}
HTH,
--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]