Я думал, что перечислители enum [class]
были литералами, потому что, насколько я понимаю, они представляют для своих enum [class]
то, что 1
представляет для int
, true
для bool
и "hello"
для char const*
. Однако это не так, потому что в стандарте перечислены только эти литералы,
literal:
integer-literal
character-literal
floating-point-literal
string-literal
boolean-literal
pointer-literal
user-defined-literal
тогда как слово литерал вообще не встречается в [dccl.enum].
Есть ли причина, по которой стандарт не классифицирует перечислители как литералы того типа перечисления, к которому они принадлежат?
Есть ли техническая причина, по которой перечислитель не является литералом?
Вы заметите, что термин «литерал» определен в стандартной главе C++ «Лексические соглашения». «Лексический» здесь относится к Лексическому анализу, который берет последовательность символов и генерирует последовательность токенов. Затем эти токены подвергаются грамматической обработке.
C++ определяет различные классы токенов. Среди них ключевые слова, операторы, знаки препинания, идентификаторы и да-литералы. Но это все литерал: своего рода токен. Классификация лексического анализа последовательности символов.
Перечислитель не является продуктом лексического анализа символов; это продукт синтаксического анализа последовательности токенов. Рассмотрим эту последовательность текста: name1::name2
. Лексически вы знаете, что это такое: это идентификатор, за которым следует оператор ::
, за которым следует идентификатор.
Однако грамматически... вы понятия не имеете. Возможно, name1
обозначает класс, а name2
является членом этого класса. Возможно, name1
— это пространство имен, а name2
— член этого пространства имен. Или... может быть, name1
— это перечисление, а name2
— перечислитель внутри этого перечисления.
Вы не можете знать только из последовательности текста в отдельности. Синтаксис зависит от контекста, а без контекста все, что у вас есть, — это набор токенов.
Перечислитель не может быть литералом, потому что определение того, что является или не является перечислителем, является продуктом процесса, который происходит после определения того, что является и не является литералом.
«Буквальное» — синтаксическое понятие, а не семантическое; его можно обнаружить только по его синтаксической форме, по признакам, из которых он состоит. Синтаксически перечислитель является идентификатором; не очевидно, что это на самом деле перечислитель, пока не будет выполнен поиск имени.