【问题标题】:std::function as a parameter in delegate constructorstd::function 作为委托构造函数中的参数
【发布时间】:2018-11-19 17:16:44
【问题描述】:

我想知道为什么控制如果我将abc(AB) 传递到main() 时控制转到main(),因为当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);
}

【问题讨论】:

    标签: c++11 constructor std-function


    【解决方案1】:
    abc(AB);
    

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

    abc{AB};
    

    这“有效”,因为它不能被解析为声明,而您的版本可以。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • '@John Zwinck' 我没有通过你的方法得到输出..请给我推荐一个更好的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多