Ответ 1
Используя гиперссылку С++-грамматики, синтаксический разбор decltype(void())
:
decltype( expression )
decltype( assignment-expression )
decltype( conditional-expression )
... здесь много шагов, связанных с порядком операций...
decltype( postfix-expression )
decltype( simple-type-specifier ( expression-listopt ) )
decltype( void() )
Итак, void()
- это своего рода expression
, в частности postfix-expression
.
В частности, цитируя раздел 5.2.3 [expr.type.conf] параграф 2 стандарта ISO С++ 2011 года:
Выражение
T()
, гдеT
является спецификатором простого типа или typename-specifier для типа объекта без массива или типа (возможно cv-qualit)void
, создает значение знака заданный тип, который инициализируется значением (8.5; никакая инициализация не является сделано для случаяvoid()
).
Итак, void()
является выражением типа void
, так же как int()
является выражением типа int
(со значением 0
). Очевидно, что выражение void не имеет значения, но здесь это операнд decltype
, поэтому он не оценивается. decltype
относится только к типу операнда, а не к его значению.
decltype(void())
- это просто подробный способ обращения к типу void
.