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)
这是一个详细的类型说明符。C++14 中的相关引用是:
\n\n\n\n\n\n\n
[basic.lookup.elab]/2:[...] 如果详细类型说明符是由类键引入的,并且此查找未找到先前声明的类型名称,或者如果详细类型说明符出现在带有形式:Run Code Online (Sandbox Code Playgroud)\n\nclass-key attribute-specifier-seqopt identifier ;\n详细类型说明符是一个引入类名的声明,如 3.3.2 中所述。
\n
这声明了类名,如下所示:
\n\n\n\n\n\n\n
[basic.scope.pdecl]/7:首先在详细类型说明符中声明的类的声明点如下:\xe2\x80\x94 [...]
\n\n\xe2\x80\x94 为以下形式的详细类型说明符
\n\nRun Code Online (Sandbox Code Playgroud)\n\nclass-key identifier\n如果在命名空间作用域中定义的函数的decl-specifier-seq或parameter-declaration-clause中使用详细类型说明符,则该标识符将在包含该声明的命名空间中声明为类名;否则,除非作为友元声明,否则标识符将在包含该声明的最小命名空间或块作用域中声明。
\n
因为struct A是一个详细的类型说明符并且A之前没有声明过,A所以是在包含该声明的命名空间(在本例中为全局命名空间)中声明的。