Как я понял в С++ 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&
, Это еще более запутанно. Я не знаю, стандартное ли это поведение.