I read this about class in the C++ standard document:
A class is a type. Its name becomes a class-name (9.1) within its scope.
class-name: identifier template-id
I found this grammar for an identifier in the C++ Standard:
2.10 Identifiers
identifier: nondigit
identifier nondigit
identifier digit
nondigit: one of universal-character-name
_ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
digit: one of 0 1 2 3 4 5 6 7 8 9
Now I tried doing this:
class
{
public:
int i;
};
and it compiles fine without any name.
Can anyone give me an explanation regarding this? Isn't it a violation of the grammar specified for an identifier?
Nawaz had asked a follow up question regarding the standard compliance of the code I had given. Those interested can check it out here.
The grammar goes
class-specifier:
class-head { member-specification_opt }
class-head:
class-key attribute-specifier-seq_opt class-head-name class-virt-specifier-seq_opt base-clause_opt
class-key attribute-specifier-seq_opt base-clause_opt
class-key:
class
struct
union
In your case, the second production of class-head
is used -- no class-name
is involved.