std::function как параметр в конструкторе делегата
Я хочу знать, почему управление не переходит к AB(), если я передал abc(AB) в main(), так как управление идет для инициализации i как 10, когда передается abc(10)
class abc
{
int i;
std::function<void(void)>func = nullptr;
public:
abc(){}
abc(std::function<void(void)>&fb):func(fb){}
abc(int i):i(i){}
};
void AB()
{
cout<< "fun_AB";
}
int main()
{
abc(AB);
abc(10);
}
2 ответа
Решение
abc(AB);
Это объявление переменной типа abc
названный AB
эквивалентно abc AB;
, Итак, конструктор без аргументов называется. Вы можете использовать этот синтаксис, если не хотите называть переменную:
abc{AB};
Это "работает", поскольку не может быть проанализировано как объявление, в то время как ваша версия может.
Но этого недостаточно, вам нужно изменить конструктор, чтобы принять const&
:
abc(std::function<void(void)> const& fb) : func(fb)
{
func(); // if you want AB to be called
}
(Неконстантная ссылка не будет привязана к временному.)
Ваш конструктор вызывается с AB
которая является функцией:
abc(std::function<void(void)>&fb) : func(fb) {}
Это инициализирует func
указать на AB
, но не более того. Возможно, вы хотели назвать это:
abc(std::function<void(void)>&fb) : func(fb) { func(); }