Как функция передаётся в качестве параметра?

103
21 апреля 2021, 02:20
string GetDB()
{
    return "Show DB";
}
void Show(string(*fun)())
{
    cout << fun() << endl;
}
int main()
{
    Show(GetDB);
}

Не совсем могу понять как в шестой строке функция передаётся в качестве параметра. Как я понял, код string(*fun)() должен обьявлять указатель fun, которому я могу потом присвоить ссылку на функцию (вроде fun = GetDB). Но почему мы строку присваивания пишем в аргумент функции, и почему функция GetDB при попадании в этот аргумент копирует свой адрес в указатель fun?

Answer 1

string(*fun)() - это указатель на функцию, а не ссылка на функцию.

Тип "функция" в языках С и С++ является неявно приводимым к соответствующему типу "указатель на функцию". Поэтому когда вы пишете

Show(GetDB);

язык С++ неявно преобразует аргумент GetDB типа string() к требуемому типу параметра string (*)(). Если вам так больше нравится, вы можете явно сформировать указатель на функцию

Show(&GetDB);

Оба варианта полностью эквивалентны.

Симметричным образом, при вызове через указатель fun вы можете напрямую применять оператор () к указателю fun, как в вашем оригинальном коде, а можете предварительно явно разыменовывать указатель (*fun)(). Оба варианта полностью эквивалентны.

READ ALSO
Обратиться к псевдониму типа в определении метода вне класса

Обратиться к псевдониму типа в определении метода вне класса

Составил небольшой примерКомпилятор не может найти тип ref как возвращаемое значение метода getA()

92
Специализация шаблонов и общий код

Специализация шаблонов и общий код

При специализации шаблона под конкретный тип, общий класс используется на ура, а специализация, использующая то же определение метода, что...

86
Проблема с записью в массив Jquery [закрыт]

Проблема с записью в массив Jquery [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

107
Как скрыть тег html таблицы по itemprop

Как скрыть тег html таблицы по itemprop

Как можно скрыть первую строку в таблице, если таблица для товара создается автоматически в админкеПробовал через js (сам новичок в этом),...

107