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 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,
_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,
_Ty=std::tr1::_Function_impl0<char>,
_Alloc=std::allocator
]
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>(_Fty)' being compiled
with
[
_Ret=char,
_Ty=p_functor_class_char,
_Fty=std::tr1::reference_wrapper
]
test_vc10_refwrapper.cpp(15) : see reference to function template instantiation 'std::tr1::function<_Fty>::function(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.