Разница между функциями и указателями на функции в качестве аргументов - PullRequest
1 голос
/ 21 октября 2011

Это довольно простой вопрос, который делает меня немного любопытным. Рассмотрим следующий фрагмент кода:

#include <iostream>

int three()
{
    return 3;
}

void foo(int func(void))
{
    std::cout << func() << std::endl;
}

void bar(int (*func)(void))
{
    std::cout << func() << std::endl;
}

int main()
{
    foo(three);
    bar(three);
    return 0;
}

// output:
// 3
// 3

Как видите, у нас есть две функции, которые в качестве единственного аргумента принимают другую функцию. Однако функции прототипов для них различаются. В основном у нас есть void foo(int func(void)) и void bar(int (*func)(void)). На первый взгляд кажется, что foo получает саму функцию, а bar получает указатель на функцию.

Однако оба они дают одинаковые результаты, имеют одинаковое тело и вызываются одинаково.

У меня вопрос, есть ли действительно скрытая разница между foo и bar? Это просто необязательный синтаксис в C ++? Один из двух случаев считается "плохим стилем" в C ++?

Если мой компилятор является фактором, я использую Visual Studio 2010.

1 Ответ

9 голосов
/ 21 октября 2011

Разницы нет: типы foo и bar одинаковы: int(int(*)()).

Нет такой вещи как параметр типа функции: когда параметр появляется с синтаксисом типа функции (например, int func(void)), он преобразуется в соответствующий тип указателя на функцию (например, int (*func)(void)).

Преобразование аналогично тому, как параметр, объявленный с синтаксисом массива (например, int a[]), преобразуется в соответствующий тип указателя (int* a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...