12 Classes [class]

12.4 Local class declarations [class.local]

Класс может быть объявлен в определении функции; такой класс называется local классом. Имя локального класса является локальным для окружающей его области видимости. Локальный класс находится в области охватывающей области и имеет такой же доступ к именам вне функции, как и включающая функция. Объявления в локальном классе не должны быть odr-use переменной с автоматической продолжительностью хранения из охватывающей области. [Example:

int x;
void f() {
  static int s;
  int x;
  const int N = 5;
  extern int q();

  struct local {
    int g() { return x; }       // error: odr-use of automatic variable x
    int h() { return s; }       // OK
    int k() { return ::x; }     // OK
    int l() { return q(); }     // OK
    int m() { return N; }       // OK: not an odr-use
    int* n() { return &N; }     // error: odr-use of automatic variable N
  };
}

local* p = 0;                   // error: local not in scope

end example]

Вмещающая функция не имеет специального доступа к членам локального класса; он подчиняется обычному access rules. Функции-члены локального класса должны быть определены в их определении класса, если они вообще определены.

Если класс X является локальным классом, вложенный класс Y может быть объявлен в классе X и позже определен в определении класса X или позже определен в той же области, что и определение класса X. Класс, вложенный в локальный класс, является локальным классом.

Локальный класс не должен иметь статических элементов данных.