Ответ 1
7.1.6.2 [dcl.type.simple]
- Для выражения 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
.