В C ++ термин идентификатор - это просто последовательность цифр, букв и _
, не начинающаяся с цифры. Такой идентификатор может появляться где угодно, и ему не нужно идентифицировать что-либо, несмотря на его название (каламбур не предназначен).
Термин имя связывает значение с определенной грамматической конструкцией. Спецификация C ++ говорит, что одна из следующих грамматических конструкций является именем, если оно обозначает сущность ( объект , класс , шаблон и т. Д.) или метка (к которой можно перейти с помощью goto
)
- идентификатор
- идентификатор шаблона (
identifier <...>
, operator-function-id <...>
и literal-operator-id <...>
, как в foo <int>
).
- id-функции преобразования (
operator type
, как в operator int
)
- идентификатор-оператора-функции (
operator @
, как в operator +
)
- литерал-идентификатор оператора (
operator "" identifier
, как в operator "" _foo
)
Для каждой из этих конструкций правило, когда имя совпадает с другим именем, определяется по-разному: для идентификаторов два идентичных имени последовательности одинаковы (это только лексическое сравнение). Для имен формы translation-function-id они одинаковы, если используемый тип имеет одинаковый тип (так что это семантическое сравнение).
Как вы можете видеть на примере literal-operator-id , нетерминальный идентификатор может появляться в грамматике в тех местах, где он не является именем. Поэтому не каждый идентификатор является именем, и не каждое имя является идентификатором . В примере template-id у нас есть вложенное использование имен. Конструкции перед <...>
соответственно снова являются именами, поскольку они обозначают объявленные шаблоны.