Согласно C ++ 03 Standard 9.1 - 2
"Определение класса вводит имя класса в область, где оно определено, искрывает любой класс, объект, функцию или другое объявление этого имени во вложенной области видимости (3.3). "
Таким образом, оно является действительным в соответствии со стандартом.
Немного поэкспериментируем с примером кода:
#include<iostream>
class A; //declaration
struct A { int i;}; //definition
struct B; //declaration
class B {int j;}; //definition
int main()
{
A obj;
obj.i = 10;
B obj2;
obj2.j = 10;
std::cout<<"sizeof"<<sizeof(struct B);
return 0;
}
Вот вывод:
prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context
Единственная разница между структурой и классом C ++ заключается в том, что доступ по умолчаниюспецификатор для структуры является общедоступным, а для класса - личным.
Итак, из приведенного выше примера:
В этом случае компилятор обрабатывает A
как structure
&
B
какclass
Как видите, компилятор следует кавычке из стандарта, а тип с определением - это то, что компилятор распознает по типу объявления.