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.
The identifier is omitted entirely, so the question of correct grammar for the identifier is moot. Nothing in the description says the identifier must be present. Anonymous classes are probably allowed for consistency with C struct rules, which allows constructs such as:
typedef struct { int i; } Foo;
struct { int x, y; } points[] = { {1, 2}, {3, 4} };
I don't think I've ever seen this done for a class.
class {public: int i;}
is quite useless, but you can specyfy a class without a name and then create instances of this class. Knowing that you can use the following:
class {public: int i;} a,b,c;
a.i = 5;
b.i = 4;
c.i = 3;
cout<<a.i<<" "<<b.i<<" "<<c.i;
You can use this inside a function too (as an anonimous class), so knowing that you can use something like this:
void x()
{
class {public: int i;} a,b,c;
a.i = 5;
b.i = 4;
c.i = 3;
cout<<a.i<<" "<<b.i<<" "<<c.i;
}
int main() {
x();
}
The code class { int i; };
is fully-standard conformant.You've quoted the irrelevant reference from the Standard which has nothing to do with anonymous class.
来源:https://stackoverflow.com/questions/13134845/class-with-no-name