11 Classes [class]

11.6 Local class declarations [class.local]

A class can be declared within a function definition; such a class is called a local class.
The name of a local class is local to its enclosing scope.
The local class is in the scope of the enclosing scope, and has the same access to names outside the function as does the enclosing function.
A declaration in a local class cannot odr-use ([basic.def.odr]) a local entity from an enclosing scope.
— end note
int x;
void f() {
  static int s;
  int x;
  const int N = 5;
  extern int q();
  int arr[2];
  auto [y, z] = arr;

  struct local {
    int g() { return x; }       // error: odr-use of non-odr-usable 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 non-odr-usable variable N
    int p() { return y; }       // error: odr-use of non-odr-usable structured binding y

local* p = 0;                   // error: local not in scope
— end example
An enclosing function has no special access to members of the local class; it obeys the usual access rules ([class.access]).
Member functions of a local class shall be defined within their class definition, if they are defined at all.
If class X is a local class a nested class Y may be declared in class X and later defined in the definition of class X or be later defined in the same scope as the definition of class X.
A class nested within a local class is a local class.
A local class cannot have static data members ([class.static.data]).
— end note