C++ 绑定不会接受绑定占位符的std::cref-为什么?

C++ 绑定不会接受绑定占位符的std::cref-为什么?,c++,function,c++11,methods,bind,C++,Function,C++11,Methods,Bind,我试图通过使用std::cref将一个方法作为参数函数传递,该函数本身接受一个参数,但不知何故,我无法正确地获得它。怎么了 struct node { void get(int &i){ i = x; } int x, z; void foo(std::function<void(int&)>t){ t(z); } void bar(){ x = 7;

我试图通过使用std::cref将一个方法作为参数函数传递,该函数本身接受一个参数,但不知何故,我无法正确地获得它。怎么了

struct node 
{
    void get(int &i){ 
        i = x; 
    }

    int x, z;
    void foo(std::function<void(int&)>t){ 
        t(z); 
    }

    void bar(){
        x = 7;
        z = 10;
        foo(std::bind(&node::get, this, std::cref(_1)));

        cout<< "z:" << z << std::endl; //Here is expected that z is changed to 7
    }
};
std::bind只能将占位符作为参数直接处理:std::bind…,_1

std::cref_1将占位符包装在std::reference_包装中。bind不再将其识别为占位符,并尝试将其直接传递给绑定函数,就像它对任何其他非占位符参数所做的那样

要解决绑定的此限制和其他限制,请使用lambda:

foo[this]int&x{return getstd::refx;}; 我在这里用ref替换了cref,因为get需要一个非常量引用。不管有没有lambda,你都不能在这里使用cref。请注意,std::refx在这里等同于x,并且仅用于演示目的而不是x。

std::bind只能将占位符作为参数直接处理:std::bind…,_1

std::cref_1将占位符包装在std::reference_包装中。bind不再将其识别为占位符,并尝试将其直接传递给绑定函数,就像它对任何其他非占位符参数所做的那样

要解决绑定的此限制和其他限制,请使用lambda:

foo[this]int&x{return getstd::refx;};
我在这里用ref替换了cref,因为get需要一个非常量引用。不管有没有lambda,你都不能在这里使用cref。请注意,std::refx在这里等同于x,并且仅用于演示目的而不是x。

Lambdas意味着没有真正的理由在新代码中使用std::bind…@HolyBlackCat注意到问题在于std::cref的使用;显然,你可以用1。但是我会让HolyBlackCat自己写答案。std::cref创建了一个对常量T的引用,但是get引用了一个非常量int,那么为什么您希望这种绑定能够编译呢,即使像这样包装_1占位符是合法的?Lambdas意味着没有真正的理由需要在新代码中使用std::bind…@HolyBlackCat指出,问题在于std::cref的使用;显然,你可以用1。但是我会让HolyBlackCat自己写答案。std::cref创建了一个对常量T的引用,但是get引用了一个非常量int,那么为什么您希望这种绑定能够编译呢,即使像这样包装_1占位符是合法的,您也不需要lambda中的std::ref,因为x已经是一个引用,get接受一个引用:foo[this]int&x{return getx;}@雷米尔博是的。我用它来演示它可以与绑定不同的lambda一起使用@雷米尔博是的。我已经用它来证明它可以与lambda一起使用,而不是与bind一起使用。