2

我在 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;
};

它编译得很好,没有任何名字。

谁能给我一个解释?这不是违反为标识符指定的语法吗?


Nawaz 就我给出的代码的标准合规性提出了一个后续问题。有兴趣的可以看看这里

4

4 回答 4

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涉及。

于 2012-10-30T08:11:15.910 回答
0

标识符被完全省略,因此标识符的正确语法问题没有实际意义。描述中没有说明标识符必须存在。匿名类可能允许与 C 结构规则保持一致,它允许以下构造:

typedef struct { int i; } Foo;

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

我想我从来没有见过这样的课程。

于 2012-10-30T08:08:24.590 回答
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();
}
于 2014-07-08T15:27:37.477 回答
-1

该代码class { int i; };完全符合标准。您引用了标准中与匿名类无关的无关参考。

于 2012-10-30T08:08:05.487 回答