string GetDB()
{
return "Show DB";
}
void Show(string(*fun)())
{
cout << fun() << endl;
}
int main()
{
Show(GetDB);
}
Не совсем могу понять как в шестой строке функция передаётся в качестве параметра.
Как я понял, код string(*fun)()
должен обьявлять указатель fun
, которому я могу потом присвоить ссылку на функцию (вроде fun = GetDB
). Но почему мы строку присваивания пишем в аргумент функции, и почему функция GetDB
при попадании в этот аргумент копирует свой адрес в указатель fun
?
string(*fun)()
- это указатель на функцию, а не ссылка на функцию.
Тип "функция" в языках С и С++ является неявно приводимым к соответствующему типу "указатель на функцию". Поэтому когда вы пишете
Show(GetDB);
язык С++ неявно преобразует аргумент GetDB
типа string()
к требуемому типу параметра string (*)()
. Если вам так больше нравится, вы можете явно сформировать указатель на функцию
Show(&GetDB);
Оба варианта полностью эквивалентны.
Симметричным образом, при вызове через указатель fun
вы можете напрямую применять оператор ()
к указателю fun
, как в вашем оригинальном коде, а можете предварительно явно разыменовывать указатель (*fun)()
. Оба варианта полностью эквивалентны.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Составил небольшой примерКомпилятор не может найти тип ref как возвращаемое значение метода getA()
При специализации шаблона под конкретный тип, общий класс используется на ура, а специализация, использующая то же определение метода, что...
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Как можно скрыть первую строку в таблице, если таблица для товара создается автоматически в админкеПробовал через js (сам новичок в этом),...