Рассмотрим следующий код C ++ 11:
struct C {};
void f(int(C));
Это тип f
такой же как:
typedef int T(C);
void f(T);
или это как:
void f(int C);
То есть, если (C)
быть интерпретированным как declarator
имени параметра C
или как abstract-declarator
параметра функции?
Где это указано в стандарте?
Это указано в 8.2p7
7
Другая неоднозначность возникает в параметре объявление-объявление в объявлении функции или в идентификаторе типа, который
является операндом оператора sizeof или typeid, когда имя типа вложено в скобки. В этом случае,
выбор между объявлением параметра указателя типа на функцию и объявлением
параметр с избыточными круглыми скобками вокруг идентификатора объявления. Решение состоит в том, чтобы рассмотреть имя типа
как спецификатор простого типа, а не как идентификатор объявления.
Следовательно, ваш параметр имеет тип int(*)(C)
, как вы показываете в своей первой возможной интерпретации.
Других решений пока нет …