据我所知,在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 ++。 Visual Studio不编译此代码是C模式:
void g(struct A { int a; } a);
struct A a; // 'a' uses undefined struct 'A'
答案 0 :(得分:3)
这是 elaborated-type-specifier 。 C ++ 14中的相关引用是:
[basic.lookup.elab]/2:
[...]如果引入了 elaborated-type-specifier class-key 并且此查找找不到先前声明的 type-name ,或者 elaborated-type-specifier 出现在声明中,格式为:elaborated-type-specifier 是一个声明,它引入了3.3.2中描述的类名。class-key attribute-specifier-seqopt identifier ;
这样声明了类名:
[basic.scope.pdecl]/7:
首先在 elaborated-type-specifier 中声明的类的声明点如下:- [...]
- 表格
的 elaborated-type-specifierclass-key identifier
如果 elaborated-type-specifier 用于命名空间范围中定义的函数的 decl-specifier-seq 或parameter-declaration-clause < / strong>,标识符在名称空间中声明为类名 包含声明;否则,除了作为朋友声明之外,标识符在声明中声明 包含声明的最小命名空间或块范围。
因为struct A
是一个 elaborated-type-specifier 并且A
之前没有声明过,所以A
在包含声明的命名空间中声明(在这种情况下,全局命名空间)。