【问题标题】:Class with no name没有名字的班级
【发布时间】:2012-10-19 13:08:37
【问题描述】:

我在 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 就我提供的代码的标准合规性提出了后续问题。有兴趣的可以看看here

【问题讨论】:

  • 我想知道您使用的编译器是什么:我无法在 GCC 上编译此代码。
  • @AlbertoMoriconi 我同样使用 QtCreator(en.wikipedia.org/wiki/Qt_Creator),所以我想这也应该使用 GCC。你能发布你得到的错误吗?
  • 我收到error: abstract declarator ‘<anonymous class>’ used as declaration
  • @AlbertoMoriconi 请完成编辑,我添加了一个关于后续问题的链接。您的疑问也在其中一个答案中进行了讨论。

标签: c++ class grammar identifier


【解决方案1】:
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();
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • -1,他引用的描述说必须存在标识符。
    • @JohannesSchaub-litb:就发布的代码而言,该引用无关紧要。
    • 你说的是“描述”。我一定是假设你提到了这个问题。
    • @JohannesSchaub-litb:是的,我指的是问题中的引文。在任何版本的问题中,我都找不到任何类似“类必须有名称”的内容(引用或以其他方式)。我错过了什么?我想当你指出时我会拍拍我的额头,但我就是看不到。
    【解决方案3】:

    语法去

    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • @JohannesSchaub-litb : class { public: int i; }; 不完全符合标准?为什么?
      • @JohannesSchaub-litb:你能告诉我class { public: int i; }; 有什么问题吗?为什么不符合标准? (我在等你的回答,所以我可能自己知道)。
      • 虽然它在语法上是有效的,但它打破了这样一个类必须在其封闭范围内声明至少一个名称的规则。
      • @JohannesSchaub-litb:我没听懂。你在说什么名字?你能详细说明一下吗?
      • 如果您对详细解释感兴趣,您可能想问一个 Stackoverflow 问题。这些评论框太小了。
      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多