Index: boost/utility/detail/result_of_iterate.hpp
===================================================================
--- boost/utility/detail/result_of_iterate.hpp	(revision 81545)
+++ boost/utility/detail/result_of_iterate.hpp	(working copy)
@@ -37,11 +37,11 @@
             (boost::detail::has_result_type<F>::value)> >::type { };
 #endif
 
-#ifdef BOOST_RESULT_OF_USE_DECLTYPE
+#if defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)
 
 // Uses declval following N3225 20.7.7.6 when F is not a pointer.
 template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
-struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
+struct cpp0x_result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
     : mpl::if_<
           is_member_function_pointer<F>
         , detail::tr1_result_of_impl<
@@ -139,8 +139,23 @@
 
 } // namespace detail
 
-#else // defined(BOOST_RESULT_OF_USE_DECLTYPE)
 
+#if defined(BOOST_RESULT_OF_USE_DECLTYPE) 
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct result_of<F(BOOST_RESULT_OF_ARGS)>
+    : cpp0x_result_of<F(BOOST_RESULT_OF_ARGS)> { };
+#endif
+
+#if defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)
+template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
+struct result_of<F(BOOST_RESULT_OF_ARGS)>
+    : mpl::if_<mpl::or_<detail::has_result_type<F>, detail::has_result<F> >,
+               tr1_result_of<F(BOOST_RESULT_OF_ARGS)>,
+               cpp0x_result_of<F(BOOST_RESULT_OF_ARGS)> >::type { };
+#endif
+
+#else // defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)
+
 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 template<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>
 struct result_of<F(BOOST_RESULT_OF_ARGS)>
Index: boost/utility/result_of.hpp
===================================================================
--- boost/utility/result_of.hpp	(revision 81545)
+++ boost/utility/result_of.hpp	(working copy)
@@ -38,18 +38,31 @@
 
 // Use the decltype-based version of result_of by default if the compiler
 // supports N3276 <http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3276.pdf>.
-// The user can force the choice by defining either BOOST_RESULT_OF_USE_DECLTYPE or
-// BOOST_RESULT_OF_USE_TR1, but not both!
-#if defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1)
-#  error Both BOOST_RESULT_OF_USE_DECLTYPE and BOOST_RESULT_OF_USE_TR1 cannot be defined at the same time.
+// The user can force the choice by defining BOOST_RESULT_OF_USE_DECLTYPE,
+// BOOST_RESULT_OF_USE_TR1, or BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK but not more than one!
+#if (defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1)) || \
+    (defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)) || \
+    (defined(BOOST_RESULT_OF_USE_TR1) && defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK))
+#  error More than one of BOOST_RESULT_OF_USE_DECLTYPE, BOOST_RESULT_OF_USE_TR1 and \
+  BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK cannot be defined at the same time.
 #endif
 
+#if defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK) && defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
+#  error Cannot fallback to decltype if the presence of a nested result struct cannot be tested.
+#endif
+
 #ifndef BOOST_RESULT_OF_USE_TR1
 #  ifndef BOOST_RESULT_OF_USE_DECLTYPE
-#    ifndef BOOST_NO_DECLTYPE_N3276 // this implies !defined(BOOST_NO_DECLTYPE)
-#      define BOOST_RESULT_OF_USE_DECLTYPE
-#    else
-#      define BOOST_RESULT_OF_USE_TR1
+#    ifndef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
+#      ifndef BOOST_NO_DECLTYPE_N3276 // this implies !defined(BOOST_NO_DECLTYPE)
+#        define BOOST_RESULT_OF_USE_DECLTYPE
+#      else
+#        if !defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
+#          define BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
+#        else
+#          define BOOST_RESULT_OF_USE_TR1
+#        endif
+#      endif
 #    endif
 #  endif
 #endif
@@ -58,12 +71,15 @@
 
 template<typename F> struct result_of;
 template<typename F> struct tr1_result_of; // a TR1-style implementation of result_of
+template<typename F> struct cpp0x_result_of;
 
 #if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 namespace detail {
 
 BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
 
+BOOST_MPL_HAS_XXX_TEMPLATE_DEF(result)
+
 template<typename F, typename FArgs, bool HasResultType> struct tr1_result_of_impl;
 
 #ifdef BOOST_NO_SFINAE_EXPR
Index: libs/utility/test/result_of_test.cpp
===================================================================
--- libs/utility/test/result_of_test.cpp	(revision 81545)
+++ libs/utility/test/result_of_test.cpp	(working copy)
@@ -150,6 +150,21 @@
     return i;
 }
 
+#if !defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_RESULT_OF_USE_TR1)
+template <typename R, typename F>
+void check_void_result_of_lambda_is(F f)
+{
+  BOOST_STATIC_ASSERT((boost::is_same<typename boost::result_of<F()>::type, R>::value));
+  BOOST_STATIC_ASSERT((boost::is_same<typename boost::cpp0x_result_of<F()>::type, R>::value));
+}
+template <typename R, typename F>
+void check_unary_result_of_lambda_is(F f)
+{
+  BOOST_STATIC_ASSERT((boost::is_same<typename boost::result_of<F(int)>::type, R>::value));
+  BOOST_STATIC_ASSERT((boost::is_same<typename boost::cpp0x_result_of<F(int)>::type, R>::value));
+}
+#endif
+
 struct X {};
 
 int main()
@@ -169,6 +184,7 @@
   typedef int (X::*mem_func_ptr_v)(float) volatile;
   typedef int (X::*mem_func_ptr_cv)(float) const volatile;
   typedef int (X::*mem_func_ptr_0)();
+  typedef int (*pf_t)(int);
 
   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type(float)>::type, int>::value));
   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(double)>::type, int>::value));
@@ -215,6 +231,36 @@
   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, int>::value));
 #endif
 
+#if !defined(BOOST_NO_CXX11_DECLTYPE)
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, char>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, char>::value));
+
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ptr(char, float)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ref(char, float)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ptr_0()>::type, int>::value)); 
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ref_0()>::type, int>::value)); 
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ptr_void(char, float)>::type, void>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ref_void(char, float)>::type, void>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ptr_void_0()>::type, void>::value)); 
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<func_ref_void_0()>::type, void>::value)); 
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<mem_func_ptr(X,char)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<mem_func_ptr_c(X,char)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<mem_func_ptr_v(X,char)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<mem_func_ptr_cv(X,char)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<mem_func_ptr_0(X)>::type, int>::value)); 
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<pf_t(int)>::type, int>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<pf_t const(int)>::type,int>::value));
+
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<result_of_member_function_template(double)>::type, double>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<const result_of_member_function_template(double)>::type, cv_overload_check<const double> >::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<volatile result_of_member_function_template(double)>::type, cv_overload_check<volatile double> >::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<const volatile result_of_member_function_template(double)>::type, cv_overload_check<const volatile double> >::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<result_of_member_function_template(int &, int)>::type, int &>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<result_of_member_function_template(int const &, int)>::type, int const &>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<result_of_member_function_template(int volatile &, int)>::type, int volatile &>::value));
+  BOOST_STATIC_ASSERT((is_same<cpp0x_result_of<result_of_member_function_template(int const volatile &, int)>::type, int const volatile &>::value));
+#endif
+
   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_type_and_float_result_of_and_char_return(char)>::type, int>::value));
   BOOST_STATIC_ASSERT((is_same<tr1_result_of<int_result_type_and_float_result_of_and_char_return_template<void>(char)>::type, int>::value));
 
@@ -266,14 +312,13 @@
   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(int volatile &, int)>::type, int volatile &>::value));
   BOOST_STATIC_ASSERT((is_same<tr1_result_of<result_of_member_function_template(int const volatile &, int)>::type, int const volatile &>::value));
 
-  typedef int (*pf_t)(int);
   BOOST_STATIC_ASSERT((is_same<result_of<pf_t(int)>::type, int>::value));
   BOOST_STATIC_ASSERT((is_same<result_of<pf_t const(int)>::type,int>::value));
 
   BOOST_STATIC_ASSERT((is_same<tr1_result_of<pf_t(int)>::type, int>::value));
   BOOST_STATIC_ASSERT((is_same<tr1_result_of<pf_t const(int)>::type,int>::value));
 
-#if defined(BOOST_RESULT_OF_USE_DECLTYPE)
+#if defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)
   BOOST_STATIC_ASSERT((is_same<result_of<no_result_type_or_result(double)>::type, short>::value));
   BOOST_STATIC_ASSERT((is_same<result_of<const no_result_type_or_result(double)>::type, cv_overload_check<const short> >::value));
   BOOST_STATIC_ASSERT((is_same<result_of<volatile no_result_type_or_result(double)>::type, cv_overload_check<volatile short> >::value));
@@ -306,5 +351,15 @@
   sfinae_test(sfinae_test_f, i);
 #endif // defined(BOOST_RESULT_OF_USE_DECLTYPE)
 
+#if !defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_RESULT_OF_USE_TR1)
+  check_void_result_of_lambda_is<float>([]{ return 0.f; });
+  check_void_result_of_lambda_is<double>([]() -> double { return 0; });
+  check_void_result_of_lambda_is<void>([]{});
+
+  check_unary_result_of_lambda_is<float>([](int){ return 0.f; });
+  check_unary_result_of_lambda_is<double>([](int) -> double { return 0; });
+  check_unary_result_of_lambda_is<void>([](int){});
+#endif
+
   return 0;
 }
Index: libs/utility/utility.htm
===================================================================
--- libs/utility/utility.htm	(revision 81545)
+++ libs/utility/utility.htm	(working copy)
@@ -185,15 +185,15 @@
 &gt;::type type; // type is int</pre>
                 </blockquote>
 
-                <p>You can test whether <code>result_of</code> is using
-                <code>decltype</code> by checking if the macro
+                <p>You can test whether <code>result_of</code> is automatically
+                using <code>decltype</code> by checking if the macro
                 <code>BOOST_RESULT_OF_USE_DECLTYPE</code> is defined after
                 including <code>result_of.hpp</code>. You can also force
                 <code>result_of</code> to use <code>decltype</code> by
                 defining <code>BOOST_RESULT_OF_USE_DECLTYPE</code> prior
                 to including <code>result_of.hpp</code>.</p>
 
-                <p>If <code>decltype</code> is not used,
+                <p>If <code>decltype</code> is not supported by the compiler,
                 then automatic result type deduction of function
                 objects is not possible. Instead, <code>result_of</code>
                 uses the following protocol to allow the programmer to
@@ -255,6 +255,28 @@
                 represent the return type of
                 <code>operator()</code> given a call expression.</p>
 
+                <p>If your compiler supports <code>decltype</code> in a form
+                which is inadequate to justify its automatic use (see the
+                <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf">proposal</a> which the compiler must implement to be considered adequate),
+                a hybrid approach is used.  If a member type
+                <code>result_type</code> or a member template struct
+                <code>result</code> is present, then the
+                non-<code>decltype</code> <code>result_of</code> protocol is
+                used.  If neither type is present, then <code>result_of</code>
+                falls back on the <code>decltype</code>-based protocol.  This
+                allows <code>result_of</code> to be used on compilers which
+                support C++11 lambda functions (which define neither
+                result_type nor result) and partially support
+                <code>decltype</code>.  You can test whether
+                <code>result_of</code> is automatically using this hybrid
+                approach by checking if the macro
+                <code>BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK</code>
+                is defined after including <code>result_of.hpp</code>.  You
+                can also force <code>result_of</code> to use this hybrid
+                approach by defining 
+                <code>BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK</code>
+                prior to including <code>result_of.hpp</code>.</p>
+
                 <a name="BOOST_NO_RESULT_OF"></a>
                 <p>This implementation of <code>result_of</code>
                 requires class template partial specialization, the
