C++11参数子句中声明符和抽象声明符之间的歧义
C++11 ambiguity between declarator and abstract-declarator in parameter clause?
考虑以下C++11代码:
struct C {};
void f(int(C));
f
的类型与相同吗
typedef int T(C);
void f(T);
还是像:
void f(int C);
也就是说,(C)
应该被解释为参数名称C
的declarator
,还是被解释为函数参数的abstract-declarator
?
标准中对此有何规定?
这在8.2p7 中指定
7另一个歧义出现在函数声明的参数声明子句中,或者出现在当类型名称嵌套在圆括号中时,是sizeof或typeid运算符的操作数。在这种情况下,选择是在指针指向函数类型的参数声明和参数,声明符-id周围有多余的括号。解决方案是考虑类型名称作为一个简单的类型说明符,而不是声明符-id。
因此,参数的类型为int(*)(C)
,如您在第一个可能的解释中所示。
相关文章:
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 如何声明不同类型的模板化类之间的转换
- 类型测试对象的动态数组的这两个声明之间的区别?
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 重复符号 --- 定义和声明之间的差异
- 以下声明之间的区别
- 一条线和两行声明之间的差异
- 恒定声明全局或在使用它的函数中声明恒定声明之间有什么区别?
- 在构造函数中创建数组与在 C++ 中创建声明之间的区别
- 以下声明之间的区别是什么
- 以下声明之间的区别
- pimpl 最终用户的全局远向声明与私有远向声明之间的区别
- C++中include指令和forward声明之间的区别
- 这两个与灰泥相关的声明之间有区别吗
- 2D矢量声明之间的区别
- c++0x:解决函数定义后接空声明和简单声明之间的歧义
- 带有 extern 和没有 extern 的函数的本地/块范围声明之间的区别
- C中的这些声明之间有什么区别