[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. Для меня двусмысленно говорить о том, означает ли "тип объекта" его тип времени выполнения или его статический тип.