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)()
. Оба варианта полностью эквивалентны.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Составил небольшой примерКомпилятор не может найти тип ref как возвращаемое значение метода getA()
При специализации шаблона под конкретный тип, общий класс используется на ура, а специализация, использующая то же определение метода, что...
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Как можно скрыть первую строку в таблице, если таблица для товара создается автоматически в админкеПробовал через js (сам новичок в этом),...