Рассмотрим следующий более простой пример:
void fn1(int a)
{
}
fn1 - это функция, которая принимает один параметр типа int.
Теперь взгляните на fn2:
//Same as typing void fn2(int (*b)())
void fn2(int b())
{
}
Здесь fn2 не принимает int, но принимает функцию, которая возвращает int.
Теперь, если вы хотите объявить fn1, вы можете напечатать его так:
void fn1(int);//ommit the parameter name
И вы также можете объявить fn2 так:
void fn2(int());
Пример использования:
#include <iostream>
int a()
{
sd::cout<<"hi"<<std::endl;
return 0;
}
void fn2(int b())
{
b();
}
int main(int argc, char **argv)
{
fn1(3);
fn2(a);
}
Вывод будет:
привет
Теперь есть еще одна тема, которую нужно понять ... Вы можете переслать объявление функций с областью действия.
a.cpp:
void a()
{
void c();
c();
}
//void b()
//{
// c();//<--- undeclared identifier
//}
int main(int argc, char**argv)
{
a();
return 0;
}
c.cpp
#include <iostream>
void c()
{
std::cout<<"called me"<<std::endl;
}
g ++ a.cpp c.cpp
./a.out
Вывод будет:
Позвонил мне
И связывая все это вместе. Если вы сделаете это:
int main(int argc, char**argv)
{
int b();
return 0;
}
Вы можете объявить функцию b (), которая возвращает тип int и не принимает параметров
Если бы вы сделали b = 3; тогда вы получите ошибку компиляции, поскольку вы не можете присвоить значение объявленной вперед функции.
И как только вы прочитаете все, станет ясно:
Foo x(Bar());
Вы ожидаете объявить функцию x, которая возвращает тип Foo и принимает параметр для функции, которая возвращает тип Bar.