Каждое имя вводится в некоторой части текста программы, называемой 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