Этот вопрос вдохновлен Является ли sizeof (void()) юридическим выражением?, но имеет важное различие, как описано ниже.
Соответствующее выражение:
sizeof( int() )
В грамматике С++ появляется:
Унарный-выражение:
sizeofунарное выражениеsizeof (type-id)
однако ( int() ) может соответствовать обоим этим случаям с разными значениями:
- Как унитарное выражение, это инициализированное значение
intprvalue, окруженное резервными скобками - В качестве идентификатора типа это тип функции без параметров, возвращающих
int.
В семантических ограничениях для sizeof, то есть С++ 14 [expr.sizeof]/1, объясняется, что форма sizeof( type-id ) не может применяться к типу функции.
Однако я не уверен, что нарушение этого семантического ограничения означает, что sizeof( int() ) является правильным и использует форму унарного выражения sizeof; или существует ли какое-то другое правило, которое устраняет неоднозначность этих двух случаев на более ранней стадии согласования грамматики.
NB. По другому вопросу sizeof(void()), ни одна интерпретация не является допустимой, поэтому можно утверждать, что компилятор правильно отклоняет выражение с сообщением об ошибке, указывающим, что он соответствует форме идентификатора типа. Однако gcc отклоняет sizeof( int() ) сообщение о типе-идентификаторе.
Чтобы быть ясным, мой вопрос: "Является ли sizeof( int() ) юридическим выражением?", особенно подробно о том, как соответствие грамматики работает, когда совпадают оба вышеуказанных маркированных случая.