Страницы

Поиск по вопросам

четверг, 25 октября 2018 г.

Ключевое слово class перед класс-мембером

Считается ли ключевое слово class перед класс-мембером как своего рода forward declaration класса, чтобы компилятор не беспокоился, что за "идентификатор".

Идентичны ли эти фрагменты кода?
class Foo { private: class Bar* a; };
и
class Bar; class Foo { private: Bar* a; };


Ответ

Да, идентичны.
Согласно 3.3.2 Point of declaration [basic.scope.pdecl], для таких объявлений, которые называются elaborated-type-specifier, имя объявляется во внешней области видимости.
Это можно продемонстрировать таким кодом:
struct Foo { struct Bar* a; };
struct Bar {};
int main() { Bar b; Foo f; f.a = &b; }
Однако для объявлений вида class name;, имя объявляется в той же области видимости, например
struct Foo { struct Bar; };
struct Foo::Bar {};

Комментариев нет:

Отправить комментарий