Нет, это не законно
class B
- это Локальный класс до methodA()
.
class B
не может получить доступ к нестатическим «автоматическим» локальным переменным функции включения. Но он может получить доступ к статическим переменным из окружающей области.
Существует несколько ограничений на доступ к локальным классам.
Вот ссылка на стандарт C ++:
9.8 Локальные объявления классов [class.local]
- Класс может быть определен в определении функции; такой класс называется локальным классом. Имя локального класса является локальным по отношению к окружающей его области. Локальный класс находится в области действия охватывающей области и имеет такой же доступ к именам вне функции, что и функция включения. Объявления в локальном классе могут использовать только имена типов, статические переменные, внешние переменные и функции и перечислители из прилагаемой области видимости.
* 1 028 * [Пример: * +1029 *
int x;
void f()
{
static int s ;
int x;
extern int g();
struct local {
int g() { return x; } // error: x is auto
int h() { return s; } // OK
int k() { return ::x; } // OK
int l() { return g(); } // OK
};
// ...
}
local* p = 0; // error: local not in scope
- конец примера]
2. Функция включения не имеет специального доступа к членам локального класса; он подчиняется обычным правилам доступа (пункт 11). Функции-члены локального класса должны быть определены в их определении класса, если они вообще определены.
3. Если класс X является локальным классом, вложенный класс Y может быть объявлен в классе X и позже определен в определении класса X или позднее определен в той же области, что и определение класса X. Класс, вложенный в локальный класс, является местный класс.
4. Локальный класс не должен иметь статических членов данных.