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