函数参数列表中的类声明
Class declaration inside function parameter list
据我所知,在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
是在包含声明的命名空间(在本例中为全局命名空间)中声明的。
相关文章:
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 对可变参数使用声明.如何选择正确的功能
- Arduino C++在构造函数中用参数声明对象数组
- 标准::向量声明中使用的模板参数
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 构造函数/函数声明参数列表中的统一初始化
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 带参数的数据结构的全局声明
- C++使用默认模板参数键入别名和转发声明
- 警告:忽略模板参数上的属性..在 std::unique_ptr (-wignore 属性)的声明中
- C++声明模板参数阴影模板参数错误
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 如何使用参数声明实例?
- 采用nulltpr_t的构造函数:函数定义不声明参数
- c++ 函数定义不声明参数
- 在循环范围之外声明参数是否更有效?
- 在linux下使用mingw交叉编译器声明"参数"中的两种或多种数据类型
- Clang Format多行函数声明参数问题
- 氧-声明参数为可选的