std :: function как параметр в конструкторе делегата - PullRequest
0 голосов
/ 10 июня 2018

я хочу знать, почему управление не переходит к 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 ]

0 голосов
/ 10 июня 2018
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
}

(Неконстантная ссылка не будет привязана к временному.)

0 голосов
/ 10 июня 2018

Ваш конструктор вызывается с AB, который является функцией:

abc(std::function<void(void)>&fb) : func(fb) {}

Это инициализирует func, чтобы указывать на AB, но не более того.Возможно, вы хотели назвать это:

abc(std::function<void(void)>&fb) : func(fb) { func(); }
...