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

Что означает void() в decltype (void()) точно?

Это продолжение этого вопроса, точнее из комментариев этого ответа.

Что означает void() in decltype(void())?
Представляет ли он тип функции, выражение или что-то еще?

4b9b3361

Ответ 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.

Ответ 2

Я цитирую комментарий @JoachimPileborg, который, кажется, объясняет это правильно:

Я думаю, что я понял это сейчас, для описания decltype требуется выражение, а не тип. void() на самом деле не является типом здесь, но выражение C-style cast (как, например, int (12.34)) void (void) не является выражением, поэтому оно не работает. Как компилятор разбирает разные вещи, зависит от контекста, когда он ожидает тип, который он анализирует как тип, когда он ожидает выражения, которое он анализирует как выражение. sizeof() (с круглыми скобками) ожидает в первую очередь типа, иначе он анализируется как выражение в скобках.

Я не ищу кредиты или репутацию. Во всяком случае, я думаю, это был интересный ответ в ответе, который стоит посвященного вопросу для будущих читателей.