Я хотел бы понять, в чем разница между двумя объявлениями, f1 и f2, ниже:
В f1 я объявляю параметр указателем на функцию типа void(), как отличается объявление f2 от f1? Являются ли объявления эквивалентными? В main я могу вызвать оба из них с помощью прототипа void (). Я понимаю концепцию передачи по значению/указателю/ссылке, однако это функции и не совсем понимают разницу. Я не могу "изменить" функцию, переданную как параметр в f1... Спасибо!
PS: пришел к этому вопросу, когда натыкался на известную проблему Most Vexing Parsing:)
#include <iostream>
using namespace std;
void f1(void (*x)())
{
x();
}
void f2(void x())
{
x();
}
void g1()
{
cout << "Invoking f1(g1())" << endl;
}
void g2()
{
cout << "Invoking f2(g2())" << endl;
}
int main()
{
f1(g1);
f2(g2);
}
Компиляция программы и выход
Invoking f1(g1())
Invoking f2(g2())