代码之家  ›  专栏  ›  技术社区  ›  cha

将函数对象传递给std::function

  •  3
  • cha  · 技术社区  · 7 年前

    首先,我在函数对象的参数列表中使用了一个类。这是一个简化版本,说明了要点。

    class X
    {
    public:
        void zz(int a) const
        {
            std::cout << "X:zz, a = " << a << "." << std::endl;
        }
    };
    

    class Y
    {
    public:
        void operator()(const X& x)
        {
            x.zz(17);
        }
    };
    

    void test_it
    {
        X my_x;
    
        Y my_y;
        std::function<void(const X&)> f1(my_y);
        f1(my_x); // OK
    
        std::function<void(const X&)> f2(Y());
        f2(my_x); // cannot convert argument 1 from X to Y
    
        std::function<void(const X&)> f3(Y);
        f3(my_x); // cannot convert argument 1 from X to Y
    
        std::function<void(const X&)> f4(Y{});
        f4(my_x); // OK
    }
    

    第一个示例f1创建Y的一个实例my\u Y,并使用该实例创建f1。这很好用。(Y的内容被移动到std::函数构造函数中的std::函数中。)

    第二次尝试f2在f2的构造函数中构造Y的实例。当我尝试用f2(my\u x)调用它时,编译器抱怨它无法将参数1(my\u x)从x转换为Y。

    第三次尝试,f3,我只是在f3的std::function构造中命名函数对象类,失败的方式与f2相同。

    最后,f4起作用。在本例中,我使用空的初始值设定项列表构造函数对象Y。

    也许有一个简单的解释,但我不明白为什么这两个用例不能编译。特别是使用Y()的f2和使用Y{}的f4似乎与我几乎相同。

    1 回复  |  直到 7 年前
        1
  •  5
  •   François Andrieux    7 年前

    对于第二种情况,表达式 Y() Y 这不需要参数,并将该函数作为参数传递。这被称为 most vexing parse .

    对于第三种情况,不能给出类型而不是函数参数。

    std::function