C++11参数子句中声明符和抽象声明符之间的歧义

C++11 ambiguity between declarator and abstract-declarator in parameter clause?

本文关键字:声明 之间 歧义 抽象 参数 C++11 子句      更新时间:2023-10-16

考虑以下C++11代码:

struct C {};
void f(int(C));

f的类型与相同吗

typedef int T(C);
void f(T);

还是像:

void f(int C);

也就是说,(C)应该被解释为参数名称Cdeclarator,还是被解释为函数参数的abstract-declarator

标准中对此有何规定?

这在8.2p7 中指定

7另一个歧义出现在函数声明的参数声明子句中,或者出现在当类型名称嵌套在圆括号中时,是sizeof或typeid运算符的操作数。在这种情况下,选择是在指针指向函数类型的参数声明和参数,声明符-id周围有多余的括号。解决方案是考虑类型名称作为一个简单的类型说明符,而不是声明符-id。

因此,参数的类型为int(*)(C),如您在第一个可能的解释中所示。