类定义中的分号

问题描述 投票:8回答:2

我正在阅读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?
     };
    
c++ syntax
2个回答
14
投票

是,在类说明符中的函数声明后明确允许使用分号。结果,当前在C ++ 0x草案中,以下内容也有效:第一个分号属于函数定义,第二个分号属于类说明符,委托给函数定义非终结符。

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

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

在C ++ 03中已经允许在函数定义之后使用分号,但是在函数定义之后在命名空间范围内不允许使用分号。 C ++ 0x通过引入空声明来解决此问题。但是,只有当您在类主体外部对函数进行定义后使用分号时,这些内容才会出现。

Sutter在函数declarations的末尾谈论“多余”分号,但这并不完全正确。因为以下是无效语法]

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

类说明符中的多余分号仅在function-definition之后才有效。另外,由于在9.2处进行的检查发现,当函数定义是模板时,它无效。

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

这是因为它是由template-declaration

解析的(它最终会将其本身解析为function-definition的剩余文本),之后该类说明符没有附加的;

1
投票

;是一个空语句。您可以根据需要包含任意数量的空语句。绝对正确。

© www.soinside.com 2019 - 2024. All rights reserved.