The following code doesn't compile in VS2012
class Zot
{
public:
int A() { return 123; }
};
int _tmain(int argc, _TCHAR* argv[])
{
std::function<int (Zot*)> fn = &Zot::A;
return 0;
}
However, changing the assignment to
std::function<int (Zot*)> fn = std::bind(&Zot::A, std::placeholders::_1);
Does work.
There are a lot of online examples that show the original syntax. Did something change in the C++11 spec to disallow this syntax?
Is there a valid shorter form for the assignment?
Edit: the compiler error (slightly edited for reabability) is:
1>vc\include\functional(515): error C2664: 'std::_Func_class<_Ret,_V0_t>::_Set' : cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base<_Rx,_V0_t> *'
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *
1> ]
1> and
1> [
1> _Rx=int,
1> _V0_t=Zot *
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1> vc\include\functional(515) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t>::_Do_alloc<_Myimpl,_Fret(__thiscall Zot::* const &)(void),_Alloc>(_Fty,_Alloc)' being compiled
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *,
1> _Fret=int,
1> _Alloc=std::allocator<std::_Func_class<int,Zot *>>,
1> _Fty=int (__thiscall Zot::* const &)(void)
1> ]
1> vc\include\functional(515) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t>::_Do_alloc<_Myimpl,_Fret(__thiscall Zot::* const &)(void),_Alloc>(_Fty,_Alloc)' being compiled
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *,
1> _Fret=int,
1> _Alloc=std::allocator<std::_Func_class<int,Zot *>>,
1> _Fty=int (__thiscall Zot::* const &)(void)
1> ]
1> vc\include\functional(515) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t>::_Reset_alloc<_Fret,Zot,std::allocator<_Ty>>(_Fret (__thiscall Zot::* const )(void),_Alloc)' being compiled
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *,
1> _Fret=int,
1> _Ty=std::_Func_class<int,Zot *>,
1> _Alloc=std::allocator<std::_Func_class<int,Zot *>>
1> ]
1> vc\include\functional(515) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t>::_Reset_alloc<_Fret,Zot,std::allocator<_Ty>>(_Fret (__thiscall Zot::* const )(void),_Alloc)' being compiled
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *,
1> _Fret=int,
1> _Ty=std::_Func_class<int,Zot *>,
1> _Alloc=std::allocator<std::_Func_class<int,Zot *>>
1> ]
1> vc\include\functional(675) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t>::_Reset<int,Zot>(_Fret (__thiscall Zot::* const )(void))' being compiled
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *,
1> _Fret=int
1> ]
1> vc\include\functional(675) : see reference to function template instantiation 'void std::_Func_class<_Ret,_V0_t>::_Reset<int,Zot>(_Fret (__thiscall Zot::* const )(void))' being compiled
1> with
1> [
1> _Ret=int,
1> _V0_t=Zot *,
1> _Fret=int
1> ]
1> c:\..\cxx11.cpp(17) : see reference to function template instantiation 'std::function<_Fty>::function<int(__thiscall Zot::* )(void)>(_Fx &&)' being compiled
1> with
1> [
1> _Fty=int (Zot *),
1> _Fx=int (__thiscall Zot::* )(void)
1> ]
1> c:\...\cxx11.cpp(17) : see reference to function template instantiation 'std::function<_Fty>::function<int(__thiscall Zot::* )(void)>(_Fx &&)' being compiled
1> with
1> [
1> _Fty=int (Zot *),
1> _Fx=int (__thiscall Zot::* )(void)
1> ]