函数参数列表中的类声明

Class declaration inside function parameter list

本文关键字:声明 参数 列表 函数      更新时间:2023-10-16

据我所知,在C++中,函数参数列表中声明的类会自动进入封闭范围:

void f(struct A *p) {}
void g() { A *p; f(p); }

相当于:

struct A;
void f(A *p) {}
void g() { A *p; f(p); }

C++标准中的哪一节规定了这种行为?C呢?

在这种情况下,我猜C不跟在C++后面。Visual studio不编译此代码是C模式:

void g(struct A { int a; } a);
struct A a;     // 'a' uses undefined struct 'A'

这是一个详细说明的类型说明符。C++14中的相关报价是:

[basic.lookup.elab]/2:[…]如果阐述的类型说明符类键,并且此查找找不到以前声明的类型名;或者如果详细说明的类型说明符出现在形式为的声明中

class-key attribute-specifier-seqopt identifier ;

详细的类型说明符是一个声明,它引入了3.3.2中描述的类名。

这样声明类名:

[basic.scope.pdecl]/7:详细类型说明符中首次声明的类的声明点如下:

--[…]

--对于形式的详细说明的类型说明符

class-key identifier

如果在命名空间作用域中定义的函数的decl说明符seq或参数声明子句中使用详细说明的类型说明符,则标识符将声明为命名空间中的类名包含声明;否则,除了作为友元声明外,标识符在包含声明的最小命名空间或块范围。

因此,由于struct A详细阐述的类型说明符,并且A以前没有声明过,因此A是在包含声明的命名空间(在本例中为全局命名空间)中声明的。