Подтвердить что ты не робот

Почему decltype (auto) возвращает ссылку здесь?

Я думаю (думал), я понимаю auto. То же о decltype. Однако в С++ 14 в качестве возвращаемого типа функции может быть какая-то дьявольская вещь вроде decltype(auto). Рассмотрим следующее:

decltype(auto) foo()
{
    int m = 1;
    return m;
}

Тип возврата int, все имеет смысл.

Однако

decltype(auto) foo()
{
    int m = 1;
    return (m);
}

возвращает int& (т.е. ссылку на int).

У меня абсолютно НЕ ИДЕЯ, почему это происходит, почему эти круглые скобки имеют какое-то значение!? Надеюсь, кто-то может пролить свет на это.

PS: Я также отметил C++, так как есть еще много людей, которые проверяют тег C++, чем C++14.

4b9b3361

Ответ 1

7.1.6.2 [dcl.type.simple]

  1. Для выражения e тип, обозначенный как decltype (e), определяется следующим образом: - если e - это несферизованное идентификационное выражение или unparenthesized доступ к члену класса (5.2.5), decltype (e) - это тип объекта, названного e. Если такой объект отсутствует или если e называет набор перегруженных функций, программа плохо сформирована,
    - в противном случае, если e является значением x, decltype (e) является T & &, где T - тип e; - в противном случае, если e является lvalue, decltype (e) является T &, где T - тип e; - в противном случае decltype (e) - тип e.

В вашем примере у вас есть return (m), поэтому e есть (m). Это не беспардонное выражение id или член класса, поэтому мы переходим ко второму пулю. Это не значение x, поэтому мы идем к третьей пуле. Это lvalue, поэтому тип T&, где T - int.