R
Справочное
руководство по С++
R.10.4 Сводка правил области видимости.
Теперь можно свести воедино правила областей видимости для программы
на С++. Эти правила одинаково применимы для всех имен (включая
имя-typedef ($$R.7.1.3) и имя-класса ($$R.9.1)) и в любом
контексте, для которого они допустимы по синтаксису языка. Здесь
рассматриваются только области видимости на лексическом уровне,
вопросы связывания обсуждаются в $$R.3.3. Понятие момента описания
было введено в $$R.3.2.
Всякое использование имени должно быть однозначным (не считая
перегрузки) в области его видимости ($$R.10.1.1). Правила доступа
($$R.11) начинают действовать только тогда, когда имя можно однозначно
найти в области его видимости. Только при условии, что права доступа
к имени не нарушены, начинается проверка типа объекта, функции или
элемента перечисления.
Имя, которое используется вне любой функции или класса, или перед
которым стоит унарная операция разрешения области видимости ::
(и которое не уточняется бинарной операцией :: или операциями ->
или .), должно быть именем глобального объекта, или функции, или
элемента перечисления, или типа.
Имя, задаваемое после X:: или obj., где obj типа X или типа
ссылка на X, а также имя, задаваемое после ptr->, где ptr типа указатель
на X, должно быть именем члена класса X или членом базового по
отношению к X класса. Помимо этого, в обращении ptr->имя ptr может
быть объектом класса Y, в котором есть функция operator->(),
описанная таким образом, что ptr->operator() в конечном счете
оказывается указателем на X ($$R.13.4.6).
Имя, которое не уточняется одним из описанных выше способов, и,
которое используется в функции, не являющейся членом класса,
должно быть описано в том блоке, где оно используется, или в
объемлющем блоке или должно быть глобальным. Описание локального имени
скрывает описания того же имени в объемлющих блоках, а также его
описания как глобального имени. В частности, перегрузка имени
невозможна для имен в разных областях видимости ($$R.13.4).
Имя, которое не уточняется одним из описанных выше способов, и,
которое используется в функции, являющейся нестатическим членом
класса X, должно быть описано или в том блоке, где оно используется,
или в объемлющем блоке, и оно должно быть членом класса X, или
членом базового по отношению к X класса, или это имя должно быть
глобальным. Описание локальных имен скрывает описание этих же имен
в объемлющих блоках, в членах класса этой функции и среди глобальных
имен. Описание члена скрывает аналогичные описание с тем же именем
в базовых классах и среди глобальных имен.
Имя, которое не уточняется одним из описанных выше способов, и,
которое используется в статической функции-члене класса X, должно
быть описано или в том блоке, где оно используется, или в объемлющем
блоке, и должно быть статическим членом класса X, или базового по
отношению к X класса, или оно должно быть глобальным именем.
Имя формального параметра функции, заданное при ее определении
($$R.8.3), принадлежит области видимости, совпадающей с наибольшим
блоком функции (в частности, является локальным именем). Имя
формального параметра функции, заданное в ее описании ($$R.8.2.5),
а не определении, принадлежит локальной области видимости, которая
исчезает сразу же после описания функции. Стандартные значения
параметров находятся в области видимости, определяемой в момент
описания ($$R.3.2) формальных параметров функции; в них не должны
использоваться локальные переменные или нестатические члены класса,
и они вычисляются при каждом вызове функции ($$R.8.2.6).
Инициализатор-ctor ($$R.12.6.2) вычисляется в области видимости
наибольшего блока конструктора, для которого он задан. В частности,
в нем можно использовать имена формальных параметров.