函数参数列表中的类声明

ign*_*tec 9 c++ parameters language-lawyer

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

void f(struct A *p) {}

void g() { A *p; f(p); }
Run Code Online (Sandbox Code Playgroud)

相当于:

struct A;

void f(A *p) {}

void g() { A *p; f(p); }
Run Code Online (Sandbox Code Playgroud)

C++标准中的哪个部分指定了这种行为?C怎么样?

好吧,我猜C在这种情况下不遵循C++.Visual Studio不编译此代码是C模式:

void g(struct A { int a; } a);

struct A a;     // 'a' uses undefined struct 'A'
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 4

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

\n\n
\n

[basic.lookup.elab]/2:[...] 如果详细类型说明符是由类键引入的,并且此查找未找到先前声明的类型名称,或者如果详细类型说明符出现在带有形式:

\n\n
class-key attribute-specifier-seqopt identifier ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n
\n\n

这声明了类名,如下所示:

\n\n
\n

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

\n\n

\xe2\x80\x94 [...]

\n\n

\xe2\x80\x94 为以下形式的详细类型说明符

\n\n
class-key identifier\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果在命名空间作用域中定义的函数的decl-specifier-seq或parameter-declaration-clause中使用详细类型说明符,则该标识符将在包含该声明的命名空间中声明为类名;否则,除非作为友元声明,否则标识符将在包含该声明的最小命名空间或块作用域中声明。

\n
\n\n

因为struct A是一个详细的类型说明符并且A之前没有声明过,A所以是在包含该声明的命名空间(在本例中为全局命名空间)中声明的。

\n