#include <iostream>
int f( int a )
{
return a;
}
void g( int h( int arg ) )
{
h(76);
}
int main()
{
g( f );
return 0;
}
Каким образом здесь передается f как параметр функции g? Трудно представить что "по значению",
но и не по указателю вроде как...
Здравствуйте, Аноним, Вы писали:
А>
А>void g( int (*h)(int) )
А>{
А>h(76);
А>}
А>
Здравствуйте, Аноним, Вы писали:
А>А>#include <iostream>
А>int f( int a )
А>{
А> return a;
А>}
А>void g( int h( int arg ) ) // здесь h неявно интерпретируется как указатель, то есть void g(int(*h)(int arg))
А>{
А>h(76);
А>}
А>int main()
А>{
А> g( f ); // здесь происходит неявное преобразование имени функции в указатель на функцию
А> return 0;
А>}
А>
А>Каким образом здесь передается f как параметр функции g? Трудно представить что "по значению",
А>но и не по указателю вроде как...
В итоге f передаёься как указатель
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>
А>>void g( int (*h)(int) )
А>>{
А>>h(76);
А>>}
А>>
Дело в том что если я внутри функции g() вызываю typeid(h).name(), то получаю строку int __cdecl (int), (в MSVC 7.1).
А если передаю явно указатель на функцию (как у Вас) то получаю int (__cdecl*) (int).
Вопрос: так если нет разницы — почему получается по-разному?
Здравствуйте, Аноним, Вы писали:
А>Дело в том что если я внутри функции g() вызываю typeid(h).name(), то получаю строку int __cdecl (int), (в MSVC 7.1).
А>А если передаю явно указатель на функцию (как у Вас) то получаю int (__cdecl*) (int).
А>Вопрос: так если нет разницы — почему получается по-разному?
Тебя же не удивляет, что внутреннее представление ссылки совпадает с внутренним представлением указателя, а типы — разные?
Здесь тоже такая странность.
Ну а то, что указатель на функцию является функтором, наряду со ссылкой на функцию и самой функцией — т.е. можно в равной степени писать funptr() и (*funptr)() — такова особенность синтаксиса.
8.3.5/3
.....................
The type of each parameter is determined from its own decl-specifier-seq and declarator. After determining the
type of each parameter, any parameter of type “array of T” or “function returning T” is adjusted to be
“pointer to T” or “pointer to function returning T,” respectively.
.............