Ответ 1
В объявлении функции аргументы массива типов распаковываются в указатели на первый элемент, аргументы функции типа распадаются на указатель функции, поэтому сигнатура будет:
widget w( gadget(*)(), doodad(*)() );
То есть, функция, которая принимает в качестве первого аргумента указатель на функцию, не принимающую аргументов и возвращающую gadget
, которая принимает в качестве второго аргумента указатель на функцию, не принимающую аргументов и возвращающую doodad
, и что сама функция возвращает a widget
Есть еще более интересные или запутанные случаи, например:
// assume 'x' is a variable defined somewhere:
widget w(gadget(x));
Как это можно интерпретировать как объявление функции? Я имею в виду, x
- переменная, не так ли? Ну, при объявлении переменной вы можете добавить дополнительные скобки, поэтому gadget x;
и gadget (x);
объявляют одну и ту же переменную x
. То же самое относится к аргументам функций, поэтому приведенный выше код выглядит как объявление функции, которая принимает первый аргумент с именем x
типа gadget
и возвращает widget
...