diff --ru a/boost/python/detail/caller.hpp b/boost/python/detail/caller.hpp
--- a/boost/python/detail/caller.hpp
+++ b/boost/python/detail/caller.hpp
@@ -109,6 +109,21 @@ struct converter_target_type <void_result_to_python >
         return 0;
     }
 };
+
+template<class Policies, class Sig> const signature_element* get_ret()
+{
+	typedef BOOST_DEDUCED_TYPENAME Policies::template extract_return_type<Sig>::type rtype;
+	typedef typename select_result_converter<Policies, rtype>::type result_converter;
+	
+	static const signature_element ret = {
+		(is_void<rtype>::value ? "void" : type_id<rtype>().name())
+		, &detail::converter_target_type<result_converter>::get_pytype
+		, boost::detail::indirect_traits::is_reference_to_non_const<rtype>::value 
+	};
+	
+	return &ret;
+};
+
 #endif
 
     
@@ -229,16 +244,9 @@ struct caller_arity<N>
         {
             const signature_element * sig = detail::signature<Sig>::elements();
 #ifndef BOOST_PYTHON_NO_PY_SIGNATURES
+			const signature_element * ret = detail::get_ret<Policies, Sig>();
 
-            typedef BOOST_DEDUCED_TYPENAME Policies::template extract_return_type<Sig>::type rtype;
-            typedef typename select_result_converter<Policies, rtype>::type result_converter;
-
-            static const signature_element ret = {
-                (is_void<rtype>::value ? "void" : type_id<rtype>().name())
-                , &detail::converter_target_type<result_converter>::get_pytype
-                , boost::detail::indirect_traits::is_reference_to_non_const<rtype>::value 
-            };
-            py_func_sig_info res = {sig, &ret };
+            py_func_sig_info res = {sig, ret };
 #else
             py_func_sig_info res = {sig, sig };
 #endif
