Есть ли техническая причина, по которой перечислитель не является литералом?

Я думал, что перечислители 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].

Есть ли причина, по которой стандарт не классифицирует перечислители как литералы того типа перечисления, к которому они принадлежат?

«Буквальное» — синтаксическое понятие, а не семантическое; его можно обнаружить только по его синтаксической форме, по признакам, из которых он состоит. Синтаксически перечислитель является идентификатором; не очевидно, что это на самом деле перечислитель, пока не будет выполнен поиск имени.

Igor Tandetnik 04.11.2022 23:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть ли техническая причина, по которой перечислитель не является литералом?

Вы заметите, что термин «литерал» определен в стандартной главе C++ «Лексические соглашения». «Лексический» здесь относится к Лексическому анализу, который берет последовательность символов и генерирует последовательность токенов. Затем эти токены подвергаются грамматической обработке.

C++ определяет различные классы токенов. Среди них ключевые слова, операторы, знаки препинания, идентификаторы и да-литералы. Но это все литерал: своего рода токен. Классификация лексического анализа последовательности символов.

Перечислитель не является продуктом лексического анализа символов; это продукт синтаксического анализа последовательности токенов. Рассмотрим эту последовательность текста: name1::name2. Лексически вы знаете, что это такое: это идентификатор, за которым следует оператор ::, за которым следует идентификатор.

Однако грамматически... вы понятия не имеете. Возможно, name1 обозначает класс, а name2 является членом этого класса. Возможно, name1 — это пространство имен, а name2 — член этого пространства имен. Или... может быть, name1 — это перечисление, а name2 — перечислитель внутри этого перечисления.

Вы не можете знать только из последовательности текста в отдельности. Синтаксис зависит от контекста, а без контекста все, что у вас есть, — это набор токенов.

Перечислитель не может быть литералом, потому что определение того, что является или не является перечислителем, является продуктом процесса, который происходит после определения того, что является и не является литералом.

Другие вопросы по теме