While BOOST_NO_CXX11_HDR_FUNCTIONAL is not defined for VC++10 my tests show that std::ref in VC++10 is broken in a very simple case. Here is the code for that case: // test_vc10_refwrapper.cpp #include <functional> class p_functor_class_char { public: p_functor_class_char() : data('A') {} char operator()() { return data; } private: char data; }; void main() { p_functor_class_char pfcc; std::function<char ()> sf(std::ref(pfcc)); } which for VC++10 gives:
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallobj(13) : error C2440: 'return' : cannot convert from 'void' to 'char' Expressions of type void cannot be converted to other types c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxfunction(65) : see reference to function template instantiation '_Ret std::tr1::_Callable_obj<_Ty>::_ApplyX<_Rx>(void)' being compiled with [ _Ret=char, _Ty=std::tr1::reference_wrapper<p_functor_class_char>, _Rx=char ] c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxfunction(64) : while compiling class template member function 'char std::tr1::_Impl_no_alloc0<_Callable,_Rx>::_Do_call(void)' with [ _Callable=_MyWrapper, _Rx=char ] c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxfunction(386) : see reference to class template instantiation 'std::tr1::_Impl_no_alloc0<_Callable,_Rx>' being compiled with [ _Callable=_MyWrapper, _Rx=char ] c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxfunction(369) : see reference to function template instantiation 'void std::tr1::_Function_impl0<_Ret>::_Reset0o<_Myimpl,_Fty,std::allocator<_Ty>>(_Fty,_Alloc)' being compiled with [ _Ret=char, _Fty=std::tr1::reference_wrapper<p_functor_class_char>, _Ty=std::tr1::_Function_impl0<char>, _Alloc=std::allocator<std::tr1::_Function_impl0<char>> ] c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\functional(126) : see reference to function template instantiation 'void std::tr1::_Function_impl0<_Ret>::_Reset<std::tr1::reference_wrapper<_Ty>>(_Fty)' being compiled with [ _Ret=char, _Ty=p_functor_class_char, _Fty=std::tr1::reference_wrapper<p_functor_class_char> ] test_vc10_refwrapper.cpp(15) : see reference to function template instantiation 'std::tr1::function<_Fty>::function<p_functor_class_char>(std::tr1::reference_wrapper<_Ty>)' being compiled with [ _Fty=char (void), _Ty=p_functor_class_char ]
With VC++11 and VC++12 this has been fixed. Using boost::function and boost::ref there are no problems in VC++10. I realize that this might not really be an issue in Boost but I was still wondering if this is a known problem with any Boost developers. I ran into it during tests, where I was letting BOOST_NO_CXX11_HDR_FUNCTIONAL determine whether to use std or boost versions of the functionality in the C++11 <functional> header.