6 Basic concepts [basic]

6.3 Scope [basic.scope]

6.3.1 Declarative regions and scopes [basic.scope.declarative]

Каждое имя вводится в некоторой части текста программы, называемой a , которая является самой большой частью программы, в которой это имя , то есть в которой это имя может использоваться как неквалифицированное имя для ссылки на один и тот же объект. В общем, каждое конкретное имя допустимо только в пределах некоторой, возможно, несмежной части текста программы, называемой его . Чтобы определить объем объявления, иногда удобно обратиться к объекту объявления. Область действия объявления такая же, как и ее потенциальная область, если только потенциальная область не содержит другое объявление с тем же именем. В этом случае потенциальная область действия объявления во внутренней (содержащейся) декларативной области исключается из области действия объявления во внешней (содержащей) декларативной области.declarative region valid scopepotential scope

[ Example: В

int j = 24;
int main() {
  int i = j, j;
  j = 42;
}

идентификатор j объявляется дважды как имя (и используется дважды). Декларативная область первого j включает весь пример. Потенциальная область действия первого j начинается сразу после этого j и продолжается до конца программы, но ее (фактическая) область действия исключает текст между символами , и }. Декларативная область второго объявления j ( j непосредственно перед точкой с запятой) включает весь текст между { и }, но его потенциальная область исключает объявление i. Область действия второго объявления j совпадает с его потенциальной областью. ]end example

Имена, объявленные объявлением, вводятся в область видимости, в которой происходит объявление, за исключением того, что наличие a friend specifier, некоторые виды использования elaborated-type-specifierи using-directives изменяют это общее поведение.

Учитывая набор объявлений в одной декларативной области, каждое из которых указывает одно и то же неквалифицированное имя,

  • все они должны относиться к одному и тому же объекту или все относиться к функциям и шаблонам функций; или

  • ровно одно объявление должно объявлять имя класса или имя перечисления, которое не является именем typedef, а все другие объявления должны ссылаться на одну и ту же переменную, нестатический член данных или перечислитель, или все они относятся к функциям и шаблонам функций; в этом случае имя класса или имя перечисления hidden. [ Note: Имя пространства имен или имя шаблона класса должно быть уникальным в своей декларативной области ([namespace.alias], пункт [temp]). ] end note

[ Note: Эти ограничения применяются к декларативной области, в которой вводится имя, которая не обязательно совпадает с областью, в которой происходит объявление. В частности, elaborated-type-specifiers и friend declarations может ввести (возможно, невидимое) имя во включающее пространство имен; эти ограничения распространяются на этот регион. Локальные объявления extern ([basic.link]) могут вводить имя в декларативную область, где появляется объявление, а также вводить (возможно, не видимое) имя во включающее пространство имен; эти ограничения распространяются на оба региона. ] end note

[ Note: Правила поиска имени кратко изложены в [basic.lookup]. ]end note