我在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;
};
并且它没有任何名称编译好。
有人可以给我一个解释吗?是不是违反了为标识符指定的语法?
纳瓦兹已经就我所提供的代码的标准合规性提出了一个跟进问题。有兴趣的人可以查看here。
答案 0 :(得分:7)
语法
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
。
答案 1 :(得分:0)
完全省略了标识符,因此标识符的正确语法问题没有实际意义。描述中没有任何内容表明标识符必须存在。可能允许匿名类与C结构规则保持一致,这允许构造如:
typedef struct { int i; } Foo;
struct { int x, y; } points[] = { {1, 2}, {3, 4} };
我认为我从没见过这样的课程。
答案 2 :(得分: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();
}
答案 3 :(得分:-1)
代码class { int i; };
完全符合标准。您引用了标准中与匿名类无关的无关引用。