2015-02-07 5 views
0

Я пытаюсь использовать указатели функций для функции класса, а затем использовать std :: bind для вызова этой функции на объект этого класса в отдельной функции. В рамках этой отдельной функции я могу связать объект и функцию указателя один раз, а затем второй раз в Xcode, но не с MSVS2015 ...попытка переназначить std :: function с помощью std :: bind и получение ошибки «попытка ссылки на удаленную функцию»

Вот несколько базовых правил, которые воспроизводят проблему, которую я имею. Все компилируется и работает отлично на 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

std::bind не возвращает объект std::function, но один из конкретной реализации определяется типом связующего. Здесь, тогда:

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

f выводится как этот тип связующего вещества, и этот тип связующего вещества не должен быть назначаемыми, только CopyConstructible и MoveConstructible. Каркнул стандарт, [func.bind.bind]/5:

Remarks: The return type [of std::bind] shall satifsy the requirements of MoveConstructible . If all of FD and TiD satisfy the requirements of CopyConstructible , then the return type shall satisfy the requirements of CopyConstructible .

FD и TiD являются связанным типом функции и типов аргументов, соответственно. Обратите внимание, что в нем ничего не говорится о MoveAssignable и CopyAssignable, что означает , что связующее не требуется для их удовлетворения. И это означает, что в стандартном исполнении не требуется стандартное назначение

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 присваиванию.

наряду с тем, что такое требование не упоминается нигде

+0

Ааа, я начал приходить к такому выводу. Я пытался выяснить, что связывает возвращенный, а затем подумал, чтобы сделать это указателем, который я обновил позже при выполнении. Как только я создавал функцию std ::, вы ответили! Еще раз спасибо! – jimspree1200

 Смежные вопросы

  • Нет связанных вопросов^_^