6 Basic concepts [basic]

6.3 Scope [basic.scope]

6.3.2 Point of declaration [basic.scope.pdecl]

Для point of declaration имени ставится сразу после его завершения declarator и перед initializer(если есть), за исключением случаев, указанных ниже. [Example:

unsigned char x = 12;
{ unsigned char x = x; }

Здесь второй x инициализируется своим (неопределенным) значением. ] end example

[ Имя из внешней области видимости остается видимым до момента объявления имени, которое его скрывает. [Note: Example:

const int  i = 2;
{ int  i[i]; }

объявляет массив из двух целых чисел в области видимости блока. ] ] end example end note

Точка объявления для класса или шаблона класса, сначала объявленного a, class-specifierнаходится сразу после identifierили simple-template-id(если есть) в его class-head. Точка объявления для перечисления находится сразу после identifier(если есть) либо в его, enum-specifierлибо в его первом opaque-enum-declaration, в зависимости от того, что наступит раньше. Точка объявления псевдонима или шаблона псевдонима следует сразу за тем, type-idна который ссылается псевдоним.

Точка объявления using-declarator, которая не называет конструктор, находится сразу после using-declarator.

Точка объявления перечислителя находится сразу после его enumerator-definition. [Example:

const int x = 12;
{ enum { x = x }; }

Здесь перечислитель x инициализируется значением константы x, а именно 12. ] end example

После точки объявления члена класса имя члена можно искать в области его класса. [ Это верно, даже если класс является неполным. Например,Note:

struct X {
  enum E { z = 16 };
  int b[X::z];      // OK
};

end note]

Точка объявления класса, впервые объявленного в файле, elaborated-type-specifierвыглядит следующим образом:

Точка объявления для an injected-class-name следует сразу за открывающей скобкой определения класса.

Точка объявления для локальной предопределенной переменной ([dcl.fct.def]) находится непосредственно перед function-bodyопределением функции.

Точка объявления параметра шаблона - сразу после его завершения template-parameter. [Example:

typedef unsigned char T;
template<class T
  = T     // lookup finds the typedef name of unsigned char
  , T     // lookup finds the template parameter
    N = 0> struct A { };

end example]

[ Note: Дружественные объявления относятся к функциям или классам, которые являются членами ближайшего включающего пространства имен, но они не вводят новые имена в это пространство имен ([namespace.memdef]). Объявления функций в области видимости блока и объявления переменных со extern спецификатором в области видимости блока относятся к объявлениям, которые являются членами включающего пространства имен, но они не вводят новые имена в эту область. ]end note

[ Note: Для создания экземпляра шаблона см [temp.point].. ]end note