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(); }
Другие вопросы по тегам