我正在尝试使用函数指针到类成员函数,然后使用std :: bind在单独的函数中调用该类的对象上的该函数。在这个单独的函数中,我可以绑定对象和函数指针一次,然后在Xcode中第二次绑定,但不能与MSVS2015绑定...
以下是一些重现我遇到的问题的基本代码。一切都在Xcode上编译并运行良好:
class AClass
{
public:
bool isNumber1()
{
return num == 1 ? true : false;
}
private:
int num;
};
typedef bool (AClass::*isFunction)();
bool checkIsFunc (AClass& object, isFunction function)
{
auto f = std::bind(function, object);
f = std::bind(function, object); // Error occurs here
return f();
}
int main (int argc, char* argv[])
{
AClass obj;
bool outcome = checkIsFunc(obj, &AClass::isNumber1);
return 0;
}
但是,对于MSVS2015,我收到以下错误:
error C2280: 'std::_Bind<true,bool,std::_Pmf_wrap<bool (__thiscall AClass::* )(void),bool,AClass,>,AClass &> &std::_Bind<true,bool,std::_Pmf_wrap<bool (__thiscall AClass::* )(void),bool,AClass,>,AClass &>::operator =(const std::_Bind<true,bool,std::_Pmf_wrap<bool (__thiscall AClass::* )(void),bool,AClass,>,AClass &> &)': attempting to reference a deleted function
任何想法我在这里做错了或者为什么这在Xcode中工作但不在VS?
谢谢!
吉姆
答案 0 :(得分:1)
std::bind
不返回std::function
对象,而是返回实现定义的绑定器类型之一。在这里,然后:
auto f = std::bind(function, object);
f
被推断为此绑定器类型,并且此绑定器类型不必是可分配的,只有CopyConstructible和MoveConstructible。标准,[func.bind.bind] / 5:
备注: [std :: bind]的返回类型应满足
MoveConstructible
的要求。如果FD
和TiD
的所有内容都满足CopyConstructible
的要求,则返回类型应满足CopyConstructible
的要求。
FD
和TiD
分别是绑定的函数类型和参数类型。请注意,它没有提及MoveAssignable
和CopyAssignable
,这意味着 1 不需要绑定器来满足它们。这意味着作业
f = std::bind(function, object); // Error occurs here
标准不要求工作。
似乎MSVC对std::bind
的实现坚持这一点,而libc ++(我相信Xcode附带,但我不为Mac OS X开发)更宽松。
如果您希望f
成为std::function
,则必须将其明确声明为:
std::function<bool()> f = std::bind(function, object);
然后重新分配也会起作用,因为std::function
是可分配的。
1 以及其他任何地方都没有提到这样的要求