Ответ 1
Принятие (*f)()
как действительного является ошибкой GCC. Буква стандарта означает, что использование имени функции с унарным *
должно приводить к разложению имени функции в указатель. Затем указатель должен быть разыменован для получения адреса функций для выражения вызова.
Но GCC кажется умным и опускает вышеуказанное поведение. Он рассматривает (*f)
просто как f
. И вызов f
может быть выполнен с аргументами по умолчанию.
Однако, можно заставить GCC преформировать распад. Унарный +
, примененный к имени функции, будет сильно разлагать его на указатель. Итак, следующие два:
(+f)();
(*+f)();
Вызывает GCC, чтобы испускать error: too few arguments to function
в стандартной версии, в GCC 7.2 и GCC 6.3.