函数参数列表

时间:2016-06-10 08:58:12

标签: c++ parameters language-lawyer

据我所知,在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'

1 个答案:

答案 0 :(得分:3)

这是 elaborated-type-specifier 。 C ++ 14中的相关引用是:

  

[basic.lookup.elab]/2: [...]如果引入了 elaborated-type-specifier    class-key 并且此查找找不到先前声明的 type-name ,或者 elaborated-type-specifier   出现在声明中,格式为:

class-key attribute-specifier-seqopt identifier ;
      elaborated-type-specifier 是一个声明,它引入了3.3.2中描述的类名。

这样声明了类名:

  

[basic.scope.pdecl]/7:首先在 elaborated-type-specifier 中声明的类的声明点如下:

     

- [...]

     

- 表格

elaborated-type-specifier
class-key identifier
     

如果 elaborated-type-specifier 用于命名空间范围中定义的函数的 decl-specifier-seq 或parameter-declaration-clause < / strong>,标识符在名称空间中声明为类名   包含声明;否则,除了作为朋友声明之外,标识符在声明中声明   包含声明的最小命名空间或块范围。

因为struct A是一个 elaborated-type-specifier 并且A之前没有声明过,所以A在包含声明的命名空间中声明(在这种情况下,全局命名空间)。