C++11中参数子句中声明符和抽象声明符之间的二义性问题?

8

考虑以下C++11代码:

struct C {};

void f(int(C));

f的类型是否与以下相同:

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

或者是这样的吗:
void f(int C);

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

这在标准中的哪里规定了?


3
这是 void f(int(*)(C)) - 你好,MVP! :) - Xeo
@Xeo:当然,标准中的歧义在哪里得到解决? - Andrew Tomazos
1个回答

12
这在8.2p7中有明确规定。
引起另一个歧义的情况出现在函数声明的参数声明子句或作为sizeof或typeid运算符的操作数的type-id中,当一个类型名嵌套在括号中时。在这种情况下,选择是指针函数参数类型的声明还是在declarator-id周围具有多余括号的参数声明。解决方法是将类型名视为简单类型说明符而不是declarator-id。
因此,您的参数的类型为int(*)(C),就像您在第一个可能的解释中所示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接