我正在阅读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 ++ 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
处进行的检查发现,当函数定义是模板时,它无效。
解析的(它最终会将其本身解析为function-definition的剩余文本),之后该类说明符没有附加的struct A { template<typename T> void f() { }; // invalid! };
这是因为它是由template-declaration
;
。 ;
是一个空语句。您可以根据需要包含任意数量的空语句。绝对正确。