我正在读这篇文章,这里有一个代码示例:
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)
这是因为它是由模板声明解析的(它本身会将剩余的文本最终解析为函数定义),之后类说明符没有附加的;
.
归档时间: |
|
查看次数: |
3925 次 |
最近记录: |