Считается ли ключевое слово 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 {};
Комментариев нет:
Отправить комментарий