类定义中的分号

时间:2011-03-19 23:20:29

标签: c++ syntax

我正在阅读this gotw,这里有一个代码示例:

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

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

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

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

我认为静态函数定义后的分号会出错。但萨特先生说0并解释(除了我明白的事情)

  

允许使用“额外”分号   函数声明的结束。

我的问题是:

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

     struct X
     {
       int a;;;;int b; //Legal?
     };
    

2 个答案:

答案 0 :(得分:14)

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

struct A {
  void f() = delete;;
};

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

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

Sutter在函数声明结尾处讨论“额外”分号,但这并不完全正确。因为以下语法无效

struct A {
  void f();; // invalid!
};

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

struct A {
  template<typename T> void f() { }; // invalid!
};

这是因为它是由模板声明(它本身会将剩余的文本解析为最终的 function-definition )解析,而类说明符没有之后又增加;

答案 1 :(得分:1)

;是一个空的陈述。你可以拥有任意数量的空语句。这绝对是正确的。

int foobar(int arg)
{
    return 0;
};

相同
int foobar(int arg)
{
    return 0;
}
/*DO NOTHING*/;

类似的问题:Why are empty expressions legal in C/C++?

编辑:

成员声明也是声明。所以类中的空语句类似于&lt;&lt;空&gt;&gt;类中的声明语句:)