C ++ std :: bind到std :: function,VS2015中出了什么问题?

时间:2018-06-20 14:29:42

标签: c++ c++11 visual-studio-2015 visual-studio-2013 stl

我是VS2013的用户,我经常按如下方式使用初始化,并且它的工作方式很吸引人:

MyClass::MyClass myRoutine(){
    std::function<double(double)> oFunc = std::bind(&Myclass::myfunction, this, std::placeholders::_1);
}

MyClass::MyClass myfunction(double & inX){
    return 0;
}

我决定升级到VS2015,但是编译器报告错误:

  

错误C2440:'正在初始化':无法从'std :: _ Binder &转换>'到'std :: function '

发生了什么事?

2 个答案:

答案 0 :(得分:5)

功能签名不匹配:double(double)double(double&)。因此,编译错误。其中之一需要更改,例如:

double MyClass::myfunction(double inX){
    return 0;
}

答案 1 :(得分:1)

您的函数尝试通过引用(double &)引用其参数时,尝试将其赋值给带有按值(double)签名的函数。

此问题最有可能是由于一致性错误(可能与非const临时MSVC扩展进行了一些怪异的交互)而在VS2013中进行了编译。基本上,这不是有效的C ++代码。 VS2015在标准支持和一致性方面领先于以前的VS(VS2017更是如此),因此该错误代码不再编译。

无论如何,std :: bind几乎完全被lambda淘汰,而VS2010 +应该支持。它们产生更好的代码,更好的警告/错误,更容易编写和调试。

例如,您的代码无法这样重写:

std::function<double(double)> oFunc = [this](double x){ return myfunction(x); };

或者如果您确实想通过引用传递,则这样:

std::function<double(double &)> oFunc = [this](double &x){ return myfunction(x); };

请注意它更短更简单。