Когда «идентификатор» является «именем» в C ++? - PullRequest
9 голосов
/ 31 октября 2011

Когда «идентификатор» называется «имя» в C ++? Я в основном читал, что термин «имя» используется чрезмерно вместо «идентификатор», как в примере:

struct S { int i };
S thing1;

В этом случае, thing1 a имя или идентификатор ? Или термины «идентификатор» и «имя» аналогичны? В C используется ли термин «имя» при ссылке на объект?

1 Ответ

15 голосов
/ 31 октября 2011

В 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 у нас есть вложенное использование имен. Конструкции перед <...> соответственно снова являются именами, поскольку они обозначают объявленные шаблоны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...