Hello, everyone. It has been a while since my last post.
While watching CppCon 2014 I found this little gem being described by Scott Meyers.
Consider the following code:
decltype(auto) foo()
{
static int Foo;
return Foo;
}
decltype(auto) bar()
{
static int Bar;
return (Bar);
}
int main()
{
decltype(auto) a = foo();
decltype(auto) b = bar();
a++;
b++;
cout << foo() << ", " << bar() << endl;
} |
decltype(auto) foo()
{
static int Foo;
return Foo;
}
decltype(auto) bar()
{
static int Bar;
return (Bar);
}
int main()
{
decltype(auto) a = foo();
decltype(auto) b = bar();
a++;
b++;
cout << foo() << ", " << bar() << endl;
}
Would you expect this to print 0, 0? Well, not so fast. decltype(auto) is just a nicer syntax for decltype(name), where name is “unparenthesized id-expression or an unparenthesized class member access”, as described here. Therefore it follows the same rules.
That’s another corner case to remember, but I guess it could also make a nifty party trick, if one can find the right party.