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