Re: auto vs. r-value references
On 20 Feb., 21:24, dietmar wrote:
I'm trying to determine whether the upcoming C++ standard supports
the use of the auto keyword in combination with r-value references,
i.e. something like this:
auto&& var = function();
Yes, this is perfectly valid. In fact, the new for-range loop is
defined in terms of
C++ code which makes use of such an initialization:
vector<int> source();
void foo() {
for (int x : source()) {
cout << x << '\n';
}
}
will be equivalent to
void foo() {
{
auto && __range = source();
using std::begin; // only if such declaration(s) exist
using std::end; // only if such declaration(s) exist
for (auto __iter = begin(__range),
__end = end(__range);
__iter != __end;
++__iter)
{
int x = *__iter;
cout << x << '\n';
}
}
}
Here, "auto && __range = source();" prevents the reevaluation of the
range expression and unnecessary copies. In this example, __range
won't be a dangling reference due to a special rule that extends the
life-time of the temporary object beyond the end of the full
expression.
"auto deduction" is done just like template argument deduction. That
is, auto will be replaced by an lvalue reference type in case the
initializer is an lvalue expression due to a special rule that enables
"perfect forwarding". In other words:
int& one() { static int t=1; return t; }
int two() { return 2; }
int main() {
auto&& x = one(); // decltype(x) = int&
auto&& y = two(); // decltype(y) = int&&
}
Cheers!
SG
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]