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

时间:2013-06-25 15:19:03

标签: c++ c++11 most-vexing-parse

考虑以下C ++ 11代码:

struct C {};

void f(int(C));

f的类型是否与:

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

或者是这样的:

void f(int C);

也就是说,(C)应该被解释为参数名declarator的{​​{1}},还是函数参数的C

标准中指定的是什么?

1 个答案:

答案 0 :(得分:12)

这在8.2p7中指定

  

7   另一个歧义出现在函数声明的parameter-declaration-clause中,或者出现在type-id中   当类型名称嵌套在括号中时,是sizeof或typeid运算符的操作数。在这种情况下,   选择是在函数类型指针的参数声明和a的声明之间   参数,在declarator-id周围有冗余括号。决议是考虑类型名称   作为simple-type-specifier而不是declarator-id。

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