考虑以下实例:
#include <iostream>
void foo(class B, B *b);
B *c; //OK
int main(){ }
标准N4296::3.3.2/7.1 [basic.scope.pdecl]
对于形式为
class-key attribute-specifier-seqopt identifier;
的声明,该标识符在包含声明的作用域中被声明为类名。
但是根据N4296:3.3.4/1 [basic.scope.proto]
在函数声明中,或在任何函数声明符(除函数定义的声明符(8.4)之外)中,参数名称(如果提供)具有函数原型作用域,该作用域在最近的封闭函数声明符结束时终止。
因此,class B
应该已经引入了函数原型作用域。并且B
的作用域应该一直持续到foo
的声明符结束。但是这个名称在全局作用域中可见。为什么?