Я хотел бы понять, в чем разница между двумя объявлениями, 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())