std::function 作为委托构造函数中的参数

std::function as a parameter in delegate constructor

我想知道如果我将 abc(AB) 传入 main() 控件进行初始化,为什么控件 不会 转到 AB()abc(10) 通过

时 i 为 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);
}

你的构造函数是用 AB 调用的,它是一个函数:

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

这会将 func 初始化为指向 AB,但仅此而已。也许您想称呼它:

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

这是一个名为 ABabc 类型变量的声明,相当于 abc AB;。所以调用了无参数构造函数。如果不想命名变量,可以使用此语法:

abc{AB};

这个 "works" 因为它不能被解析为声明,而你的版本可以。

但这还不够,您需要更改构造函数以接受 const&:

abc(std::function<void(void)> const& fb) : func(fb)
{
  func(); // if you want AB to be called
}

(非常量引用不会绑定到临时对象。)