In order to call a function through a function pointer, the function pointer's type must exactly match the function's type. Otherwise, the behaviour is undefined. Example:
int f(); void (*p)() = reinterpret_cast<void(*)()>(f); p(); // undefined