[C++11: 7.1.6.2/4]:
Тип, обозначенный символомdecltype(e)
, определяется следующим образом:
- if
e
- это неэккрементное id-выражение или unparenthesized class member access (5.2.5),decltype(e)
- это тип объекта с именемe
. Если такой объект отсутствует или еслиe
называет набор перегруженных функций, программа плохо сформирована;- в противном случае, если
e
- значение x,decltype(e)
-T&&
, гдеT
- типe
;- в противном случае, если
e
является lvalue,decltype(e)
являетсяT&
, гдеT
является типомe
;- в противном случае
decltype(e)
является типомe
.Операндом спецификатора
decltype
является неоцениваемый операнд (пункт 5).
Второй, третий и четвертый случаи явно относятся к типу выражения, которое не включало бы никаких соображений полиморфизма.
Однако, и я не совсем уверен, что здесь означает "сущность", первый случай, как представляется, обозначает объект, на который ссылается выражение e
. Для меня двусмысленно говорить о том, означает ли "тип объекта" его тип времени выполнения или его статический тип.