Я прочитал это о классе в стандартном документе C ++:
Класс это тип. Его имя становится именем класса (9.1) в пределах его
объем.class-name: identifier template-id
Я нашел эту грамматику для идентификатора в стандарте C ++:
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
Теперь я попытался сделать это:
class
{
public:
int i;
};
и он прекрасно компилируется без имени.
Кто-нибудь может дать мне объяснение по этому поводу? Разве это не нарушение грамматики, указанной для идентификатора?
Наваз задал дополнительный вопрос относительно стандартного соответствия кода, который я дал. Желающие могут проверить это Вот.
Грамматика идет
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
В вашем случае второе производство class-head
используется — нет class-name
вовлечен.
Идентификатор полностью опущен, поэтому вопрос правильной грамматики для идентификатора является спорным. Ничто в описании не говорит, что идентификатор должен присутствовать. Анонимные классы, вероятно, разрешены для соответствия с правилами структуры C, что позволяет такие конструкции, как:
typedef struct { int i; } Foo;
struct { int x, y; } points[] = { {1, 2}, {3, 4} };
Я не думаю, что когда-либо видел, что это сделано для класса.
class {public: int i;}
Это совершенно бесполезно, но вы можете указать класс без имени, а затем создать экземпляры этого класса. Зная, что вы можете использовать следующее:
class {public: int i;} a,b,c;
a.i = 5;
b.i = 4;
c.i = 3;
cout<<a.i<<" "<<b.i<<" "<<c.i;
Вы также можете использовать это внутри функции (как анонимный класс), так что зная, что вы можете использовать что-то вроде этого:
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();
}
Код class { int i; };
полностью соответствует стандарту. Вы процитировали неуместную ссылку из Стандарта, которая не имеет ничего общего с анонимным классом.