Класс без имени

Я прочитал это о классе в стандартном документе 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;
};

и он прекрасно компилируется без имени.

Кто-нибудь может дать мне объяснение по этому поводу? Разве это не нарушение грамматики, указанной для идентификатора?


Наваз задал дополнительный вопрос относительно стандартного соответствия кода, который я дал. Желающие могут проверить это Вот.

2

Решение

Грамматика идет

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 вовлечен.

7

Другие решения

Идентификатор полностью опущен, поэтому вопрос правильной грамматики для идентификатора является спорным. Ничто в описании не говорит, что идентификатор должен присутствовать. Анонимные классы, вероятно, разрешены для соответствия с правилами структуры C, что позволяет такие конструкции, как:

typedef struct { int i; } Foo;

struct { int x, y; } points[] = { {1, 2}, {3, 4} };

Я не думаю, что когда-либо видел, что это сделано для класса.

0

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();
}
0

Код class { int i; }; полностью соответствует стандарту. Вы процитировали неуместную ссылку из Стандарта, которая не имеет ничего общего с анонимным классом.

-1
По вопросам рекламы [email protected]