类定义中的分号

Arm*_*yan 8 c++ syntax

我正在读这篇文章,这里有一个代码示例:

struct X {
  static bool f( int* p )
  {
    return p && 0[p] and not p[1:>>p[2];
  };
};
Run Code Online (Sandbox Code Playgroud)

问题是:兼容编译器应该提供多少错误:

我回答了一个,因为这段代码相当于

struct X {
  static bool f( int* p )
  {
    return p && p[0] && ! p[1] > p[2];
  };
};
Run Code Online (Sandbox Code Playgroud)

而且我认为静态函数定义之后的分号将是一个错误.但萨特先生说0并解释(除了我所理解的事情)

函数声明结束时允许使用"额外"分号.

我的问题是:

  • 标准中的哪些文字允许这样做?
  • 这仅仅是指成员函数吗?
  • 分号是否可以出现在两个成员之间或类定义中的任何其他位置,如

     struct X
     {
       int a;;;;int b; //Legal?
     };
    
    Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 14

是的,在类说明符中的函数定义之后显式允许使用分号.因此,目前在C++ 0x草案中,以下内容也是有效的:第一个分号属于函数定义,第二个分号属于委托给函数定义非终端的类说明符.

struct A {
  void f() = delete;;
};
Run Code Online (Sandbox Code Playgroud)

但是三个分号是非法的.在具有正文的函数定义之后是两个分号.规范中的相应文本是语法9.2[class.mem].

函数定义之后的分号已经在C++ 03中被允许,但在函数定义之后不允许在命名空间范围内使用它们.C++ 0x通过引入空声明来修复它.但是只有在类体外的函数定义之后有分号时才会出现这些.

Sutter在函数声明结束时讨论了"额外"分号,但这并不完全正确.因为以下是无效的语法

struct A {
  void f();; // invalid!
};
Run Code Online (Sandbox Code Playgroud)

类说明符中的额外分号仅在函数定义之后有效.此外,作为9.2揭示时的检查,当函数定义是模板时,它无效

struct A {
  template<typename T> void f() { }; // invalid!
};
Run Code Online (Sandbox Code Playgroud)

这是因为它是由模板声明解析的(它本身会将剩余的文本最终解析为函数定义),之后类说明符没有附加的;.

  • C++有疯狂的语法...非常感谢,Johannes :) (5认同)