我正在阅读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?
};
答案 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;类中的声明语句:)