尝试使用std :: bind重新分配std :: function并获取错误“尝试引用已删除的函数”

时间:2015-02-07 13:20:19

标签: c++ xcode visual-studio std-function stdbind

我正在尝试使用函数指针到类成员函数,然后使用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?

谢谢!

吉姆

1 个答案:

答案 0 :(得分:1)

std::bind不返回std::function对象,而是返回实现定义的绑定器类型之一。在这里,然后:

auto f = std::bind(function, object);

f被推断为此绑定器类型,并且此绑定器类型不必是可分配的,只有CopyConstructible和MoveConstructible。标准,[func.bind.bind] / 5:

  

备注: [std :: bind]的返回类型应满足MoveConstructible的要求。如果FDTiD的所有内容都满足CopyConstructible的要求,则返回类型应满足CopyConstructible的要求。

FDTiD分别是绑定的函数类型和参数类型。请注意,它没有提及MoveAssignableCopyAssignable,这意味着 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 以及其他任何地方都没有提到这样的要求