Итак, я только что увидел пример объявления указателя на функцию, который использует именованные параметры:
int (*func)(int a, int b) = &foo;
Я предполагаю, что это хорошо определенный код, потому что он компилируется и работает нормально: https://ideone.com/C4mhsI
Но я никогда не видел этого раньше (возможно, потому, что это увеличивает сложность и без того сложного для разбора указателей функций). Тем не менее, я хотел бы увидеть утверждение, что это допустимо, а не какое-то сумасшедшее расширение gcc. Может кто-нибудь найти мне что-нибудь?
Вы можете следовать грамматике описатель, который является объявлением без каких-либо спецификаторов типа или decl.
declarator: ptr-declarator [...] ptr-declarator: noptr-declarator ptr-operator ptr-declarator noptr-declarator: [...] noptr-declarator parameters-and-qualifiers ( ptr-declarator ) parameters-and-qualifiers: ( parameter-declaration-clause ) [...] ptr-operator: * attribute-specifier-seq[opt] cv-qualifier-seq[opt] [...]
Я удалил все грамматические правила, которые не нужны, чтобы легче им следовать. Я не буду этого делать, потому что это немного сложно записать, но в конце вы обнаружите, что у вас есть Параметры и-классификаторы это представляет параметры.
И если вы сделаете это для функции, вы увидите, что это также заканчивается Параметры и-классификаторы. Они используют одну и ту же грамматику, и ничто не запрещает это в стандарте под [Decl.ptr].
Как и вы, вы можете указать имя аргумента в объявлении функции:
int funct(int a, int b);
вы можете в функциональных указателей тоже int (*func)(int a, int b)
, В обоих случаях имена ничего не делают, и на практике они используются в качестве вспомогательного средства документирования для облегчения чтения.