Ответ 1
Это зависит от контекста; в противном случае это двусмысленно. См. этот пример (изменен за исключением ниже):
void foo(int a) { }
void foo(int a, char b) { }
int main()
{
void (*functionPointer1)(int);
void (*functionPointer2)(int, char);
functionPointer1 = foo; // gets address of foo(int)
functionPointer2 = foo; // gets address of foo(int, char)
}
Вы можете сделать это разными способами, но правило №1?
Избегайте приведения!
В противном случае вы сломаете безопасность типа и, вероятно, застрелите себя в ноге либо тогда, либо позже.
(Проблемы могут возникать при вызовах, случайных изменениях, которые вы не замечаете и т.д.)