Как я понял в С++ 11 decltype(expression) используется для вывода точного же типа данного выражения. Но когда выражение помещается в круглые скобки, то тип deduces является ссылкой lvalue на тип выражения. Например:
int x;
decltype(x) y = x;
эквивалентно int y = x;, но
int x;
decltype((x)) y = x;
эквивалентно int& y = x;.
Соответственно
decltype(auto) f1()
{
int x = 0;
return x; // decltype(x) is int, so f1 returns int
}
но
decltype(auto) f2()
{
int x = 0;
return (x); // decltype((x)) is int&, so f2 returns int&
}
Какое обоснование для этого поведения выбирается стандартным комитетом?
Послесловие:
Теперь я заметил, что, по крайней мере, в случае реализации GCC 6.2, когда выражение в круглых скобках более сложное, например decltype((x + x)), выводимый тип T, но не T&, Это еще более запутанно. Я не знаю, стандартное ли это поведение.