Use separate SFINAE parameters to minimise template instantiations.
diff --git a/asio/include/asio/execution/blocking.hpp b/asio/include/asio/execution/blocking.hpp
index 2f2c399..ebfa5c1 100644
--- a/asio/include/asio/execution/blocking.hpp
+++ b/asio/include/asio/execution/blocking.hpp
@@ -270,8 +270,12 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, blocking_t>::is_valid
-          && !traits::query_member<T, blocking_t>::is_valid
-          && traits::static_query<T, possibly_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, blocking_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, possibly_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, possibly_t>::value();
@@ -283,9 +287,15 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, blocking_t>::is_valid
-          && !traits::query_member<T, blocking_t>::is_valid
-          && !traits::static_query<T, possibly_t>::is_valid
-          && traits::static_query<T, always_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, blocking_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, possibly_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, always_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, always_t>::value();
@@ -297,10 +307,18 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, blocking_t>::is_valid
-          && !traits::query_member<T, blocking_t>::is_valid
-          && !traits::static_query<T, possibly_t>::is_valid
-          && !traits::static_query<T, always_t>::is_valid
-          && traits::static_query<T, never_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, blocking_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, possibly_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, always_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, never_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, never_t>::value();
@@ -353,7 +371,9 @@
       const Executor& ex, convertible_from_blocking_t,
       typename enable_if<
         !can_query<const Executor&, possibly_t>::value
-          && can_query<const Executor&, always_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, always_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -373,8 +393,12 @@
       const Executor& ex, convertible_from_blocking_t,
       typename enable_if<
         !can_query<const Executor&, possibly_t>::value
-          && !can_query<const Executor&, always_t>::value
-          && can_query<const Executor&, never_t>::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<const Executor&, always_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, never_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -468,10 +492,18 @@
   static ASIO_CONSTEXPR possibly_t static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, possibly_t>::is_valid
-          && !traits::query_member<T, possibly_t>::is_valid
-          && !traits::query_free<T, possibly_t>::is_valid
-          && !can_query<T, always_t<I> >::value
-          && !can_query<T, never_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, possibly_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, possibly_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, always_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, never_t<I> >::value
       >::type* = 0) ASIO_NOEXCEPT
   {
     return possibly_t();
@@ -755,7 +787,9 @@
       const Executor& e, const always_t&,
       typename enable_if<
         is_executor<Executor>::value
-        && traits::static_require<
+      >::type* = 0,
+      typename enable_if<
+        traits::static_require<
           const Executor&,
           blocking_adaptation::allowed_t<0>
         >::is_valid
diff --git a/asio/include/asio/execution/blocking_adaptation.hpp b/asio/include/asio/execution/blocking_adaptation.hpp
index 49d364d..fee7717 100644
--- a/asio/include/asio/execution/blocking_adaptation.hpp
+++ b/asio/include/asio/execution/blocking_adaptation.hpp
@@ -225,8 +225,12 @@
       typename enable_if<
         !traits::query_static_constexpr_member<
             T, blocking_adaptation_t>::is_valid
-          && !traits::query_member<T, blocking_adaptation_t>::is_valid
-          && traits::static_query<T, disallowed_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, blocking_adaptation_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, disallowed_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, disallowed_t>::value();
@@ -239,9 +243,15 @@
       typename enable_if<
         !traits::query_static_constexpr_member<
             T, blocking_adaptation_t>::is_valid
-          && !traits::query_member<T, blocking_adaptation_t>::is_valid
-          && !traits::static_query<T, disallowed_t>::is_valid
-          && traits::static_query<T, allowed_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, blocking_adaptation_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, disallowed_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, allowed_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, allowed_t>::value();
@@ -299,7 +309,9 @@
       const Executor& ex, convertible_from_blocking_adaptation_t,
       typename enable_if<
         !can_query<const Executor&, disallowed_t>::value
-          && can_query<const Executor&, allowed_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, allowed_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -392,9 +404,15 @@
   static ASIO_CONSTEXPR disallowed_t static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, disallowed_t>::is_valid
-          && !traits::query_member<T, disallowed_t>::is_valid
-          && !traits::query_free<T, disallowed_t>::is_valid
-          && !can_query<T, allowed_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, disallowed_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, disallowed_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, allowed_t<I> >::value
       >::type* = 0) ASIO_NOEXCEPT
   {
     return disallowed_t();
diff --git a/asio/include/asio/execution/bulk_execute.hpp b/asio/include/asio/execution/bulk_execute.hpp
index 001b608..d3a08dd 100644
--- a/asio/include/asio/execution/bulk_execute.hpp
+++ b/asio/include/asio/execution/bulk_execute.hpp
@@ -124,7 +124,8 @@
   ill_formed
 };
 
-template <typename S, typename Args, typename = void>
+template <typename S, typename Args, typename = void, typename = void,
+    typename = void, typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -135,15 +136,15 @@
 template <typename S, typename F, typename N>
 struct call_traits<S, void(F, N),
   typename enable_if<
-    (
-      is_convertible<N, std::size_t>::value
-      &&
-      bulk_execute_member<S, F, N>::is_valid
-      &&
-      is_sender<
-        typename bulk_execute_member<S, F, N>::result_type
-      >::value
-    )
+    is_convertible<N, std::size_t>::value
+  >::type,
+  typename enable_if<
+    bulk_execute_member<S, F, N>::is_valid
+  >::type,
+  typename enable_if<
+    is_sender<
+      typename bulk_execute_member<S, F, N>::result_type
+    >::value
   >::type> :
   bulk_execute_member<S, F, N>
 {
@@ -153,17 +154,18 @@
 template <typename S, typename F, typename N>
 struct call_traits<S, void(F, N),
   typename enable_if<
-    (
-      is_convertible<N, std::size_t>::value
-      &&
-      !bulk_execute_member<S, F, N>::is_valid
-      &&
-      bulk_execute_free<S, F, N>::is_valid
-      &&
-      is_sender<
-        typename bulk_execute_free<S, F, N>::result_type
-      >::value
-    )
+    is_convertible<N, std::size_t>::value
+  >::type,
+  typename enable_if<
+    !bulk_execute_member<S, F, N>::is_valid
+  >::type,
+  typename enable_if<
+    bulk_execute_free<S, F, N>::is_valid
+  >::type,
+  typename enable_if<
+    is_sender<
+      typename bulk_execute_free<S, F, N>::result_type
+    >::value
   >::type> :
   bulk_execute_free<S, F, N>
 {
@@ -173,26 +175,29 @@
 template <typename S, typename F, typename N>
 struct call_traits<S, void(F, N),
   typename enable_if<
-    (
-      is_convertible<N, std::size_t>::value
-      &&
-      !bulk_execute_member<S, F, N>::is_valid
-      &&
-      !bulk_execute_free<S, F, N>::is_valid
-      &&
-      is_sender<S>::value
-      &&
-      is_same<
-        typename result_of<
-          F(typename executor_index<typename remove_cvref<S>::type>::type)
-        >::type,
-        typename result_of<
-          F(typename executor_index<typename remove_cvref<S>::type>::type)
-        >::type
-      >::value
-      &&
-      static_require<S, bulk_guarantee_t::unsequenced_t>::is_valid
-    )
+    is_convertible<N, std::size_t>::value
+  >::type,
+  typename enable_if<
+    !bulk_execute_member<S, F, N>::is_valid
+  >::type,
+  typename enable_if<
+    !bulk_execute_free<S, F, N>::is_valid
+  >::type,
+  typename enable_if<
+    is_sender<S>::value
+  >::type,
+  typename enable_if<
+    is_same<
+      typename result_of<
+        F(typename executor_index<typename remove_cvref<S>::type>::type)
+      >::type,
+      typename result_of<
+        F(typename executor_index<typename remove_cvref<S>::type>::type)
+      >::type
+    >::value
+  >::type,
+  typename enable_if<
+    static_require<S, bulk_guarantee_t::unsequenced_t>::is_valid
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = adapter);
diff --git a/asio/include/asio/execution/bulk_guarantee.hpp b/asio/include/asio/execution/bulk_guarantee.hpp
index 28b2585..158d350 100644
--- a/asio/include/asio/execution/bulk_guarantee.hpp
+++ b/asio/include/asio/execution/bulk_guarantee.hpp
@@ -259,8 +259,12 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, bulk_guarantee_t>::is_valid
-          && !traits::query_member<T, bulk_guarantee_t>::is_valid
-          && traits::static_query<T, unsequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, bulk_guarantee_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, unsequenced_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, unsequenced_t>::value();
@@ -272,9 +276,15 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, bulk_guarantee_t>::is_valid
-          && !traits::query_member<T, bulk_guarantee_t>::is_valid
-          && !traits::static_query<T, unsequenced_t>::is_valid
-          && traits::static_query<T, sequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, bulk_guarantee_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, unsequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, sequenced_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, sequenced_t>::value();
@@ -286,10 +296,18 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, bulk_guarantee_t>::is_valid
-          && !traits::query_member<T, bulk_guarantee_t>::is_valid
-          && !traits::static_query<T, unsequenced_t>::is_valid
-          && !traits::static_query<T, sequenced_t>::is_valid
-          && traits::static_query<T, parallel_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, bulk_guarantee_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, unsequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, sequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, parallel_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, parallel_t>::value();
@@ -344,7 +362,9 @@
       const Executor& ex, convertible_from_bulk_guarantee_t,
       typename enable_if<
         !can_query<const Executor&, unsequenced_t>::value
-          && can_query<const Executor&, sequenced_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, sequenced_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -365,8 +385,12 @@
       const Executor& ex, convertible_from_bulk_guarantee_t,
       typename enable_if<
         !can_query<const Executor&, unsequenced_t>::value
-          && !can_query<const Executor&, sequenced_t>::value
-          && can_query<const Executor&, parallel_t>::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<const Executor&, sequenced_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, parallel_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -463,10 +487,18 @@
   static ASIO_CONSTEXPR unsequenced_t static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, unsequenced_t>::is_valid
-          && !traits::query_member<T, unsequenced_t>::is_valid
-          && !traits::query_free<T, unsequenced_t>::is_valid
-          && !can_query<T, sequenced_t<I> >::value
-          && !can_query<T, parallel_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, unsequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, unsequenced_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, sequenced_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, parallel_t<I> >::value
       >::type* = 0) ASIO_NOEXCEPT
   {
     return unsequenced_t();
diff --git a/asio/include/asio/execution/connect.hpp b/asio/include/asio/execution/connect.hpp
index 47dd58b..17a924b 100644
--- a/asio/include/asio/execution/connect.hpp
+++ b/asio/include/asio/execution/connect.hpp
@@ -157,7 +157,8 @@
   ill_formed
 };
 
-template <typename S, typename R, typename = void>
+template <typename S, typename R, typename = void,
+   typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -168,13 +169,13 @@
 template <typename S, typename R>
 struct call_traits<S, void(R),
   typename enable_if<
-    (
-      connect_member<S, R>::is_valid
-      &&
-      is_operation_state<typename connect_member<S, R>::result_type>::value
-      &&
-      is_sender<typename remove_cvref<S>::type>::value
-    )
+    connect_member<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    is_operation_state<typename connect_member<S, R>::result_type>::value
+  >::type,
+  typename enable_if<
+    is_sender<typename remove_cvref<S>::type>::value
   >::type> :
   connect_member<S, R>
 {
@@ -184,15 +185,16 @@
 template <typename S, typename R>
 struct call_traits<S, void(R),
   typename enable_if<
-    (
-      !connect_member<S, R>::is_valid
-      &&
-      connect_free<S, R>::is_valid
-      &&
-      is_operation_state<typename connect_free<S, R>::result_type>::value
-      &&
-      is_sender<typename remove_cvref<S>::type>::value
-    )
+    !connect_member<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    connect_free<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    is_operation_state<typename connect_free<S, R>::result_type>::value
+  >::type,
+  typename enable_if<
+    is_sender<typename remove_cvref<S>::type>::value
   >::type> :
   connect_free<S, R>
 {
@@ -202,24 +204,25 @@
 template <typename S, typename R>
 struct call_traits<S, void(R),
   typename enable_if<
-    (
-      !connect_member<S, R>::is_valid
-      &&
-      !connect_free<S, R>::is_valid
-      &&
-      is_receiver<R>::value
-      &&
-      conditional<
-        !is_as_receiver<
-          typename remove_cvref<R>::type
-        >::value,
-        is_executor_of<
-          typename remove_cvref<S>::type,
-          as_invocable<typename remove_cvref<R>::type, S>
-        >,
-        false_type
-      >::type::value
-    )
+    !connect_member<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    !connect_free<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    is_receiver<R>::value
+  >::type,
+  typename enable_if<
+    conditional<
+      !is_as_receiver<
+        typename remove_cvref<R>::type
+      >::value,
+      is_executor_of<
+        typename remove_cvref<S>::type,
+        as_invocable<typename remove_cvref<R>::type, S>
+      >,
+      false_type
+    >::type::value
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = adapter);
diff --git a/asio/include/asio/execution/context_as.hpp b/asio/include/asio/execution/context_as.hpp
index b4a93a5..f39376c 100644
--- a/asio/include/asio/execution/context_as.hpp
+++ b/asio/include/asio/execution/context_as.hpp
@@ -120,7 +120,9 @@
       const Executor& ex, const context_as_t<U>&,
       typename enable_if<
         is_same<T, U>::value
-          && can_query<const Executor&, const context_t&>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, const context_t&>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
diff --git a/asio/include/asio/execution/execute.hpp b/asio/include/asio/execution/execute.hpp
index 277cd18..483efbb 100644
--- a/asio/include/asio/execution/execute.hpp
+++ b/asio/include/asio/execution/execute.hpp
@@ -86,7 +86,6 @@
 } // namespace asio
 namespace asio_execution_execute_fn {
 
-using asio::conditional;
 using asio::decay;
 using asio::declval;
 using asio::enable_if;
@@ -98,6 +97,7 @@
 using asio::traits::execute_free;
 using asio::traits::execute_member;
 using asio::true_type;
+using asio::void_type;
 
 void execute();
 
@@ -109,7 +109,8 @@
   ill_formed
 };
 
-template <typename T, typename F, typename = void>
+template <typename T, typename F, typename = void, typename = void,
+    typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -118,9 +119,7 @@
 template <typename T, typename F>
 struct call_traits<T, void(F),
   typename enable_if<
-    (
       execute_member<T, F>::is_valid
-    )
   >::type> :
   execute_member<T, F>
 {
@@ -130,11 +129,10 @@
 template <typename T, typename F>
 struct call_traits<T, void(F),
   typename enable_if<
-    (
-      !execute_member<T, F>::is_valid
-      &&
-      execute_free<T, F>::is_valid
-    )
+    !execute_member<T, F>::is_valid
+  >::type,
+  typename enable_if<
+    execute_free<T, F>::is_valid
   >::type> :
   execute_free<T, F>
 {
@@ -144,26 +142,19 @@
 template <typename T, typename F>
 struct call_traits<T, void(F),
   typename enable_if<
-    (
-      !execute_member<T, F>::is_valid
-      &&
-      !execute_free<T, F>::is_valid
-      &&
-      conditional<true, true_type,
-       typename result_of<typename decay<F>::type&()>::type
-      >::type::value
-      &&
-      conditional<
-        !is_as_invocable<
-          typename decay<F>::type
-        >::value,
-        is_sender_to<
-          T,
-          as_receiver<typename decay<F>::type, T>
-        >,
-        false_type
-      >::type::value
-    )
+    !execute_member<T, F>::is_valid
+  >::type,
+  typename enable_if<
+    !execute_free<T, F>::is_valid
+  >::type,
+  typename void_type<
+   typename result_of<typename decay<F>::type&()>::type
+  >::type,
+  typename enable_if<
+    !is_as_invocable<typename decay<F>::type>::value
+  >::type,
+  typename enable_if<
+    is_sender_to<T, as_receiver<typename decay<F>::type, T> >::value
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = adapter);
diff --git a/asio/include/asio/execution/executor.hpp b/asio/include/asio/execution/executor.hpp
index fb64eba..6a9006b 100644
--- a/asio/include/asio/execution/executor.hpp
+++ b/asio/include/asio/execution/executor.hpp
@@ -35,34 +35,48 @@
 namespace execution {
 namespace detail {
 
-template <typename T, typename F>
-struct is_executor_of_impl_base :
-  integral_constant<bool,
-    conditional<true, true_type,
-        typename result_of<typename decay<F>::type&()>::type
-      >::type::value
-      && is_constructible<typename decay<F>::type, F>::value
-      && is_move_constructible<typename decay<F>::type>::value
-#if defined(ASIO_HAS_NOEXCEPT)
-      && is_nothrow_copy_constructible<T>::value
-      && is_nothrow_destructible<T>::value
-#else // defined(ASIO_HAS_NOEXCEPT)
-      && is_copy_constructible<T>::value
-      && is_destructible<T>::value
-#endif // defined(ASIO_HAS_NOEXCEPT)
-      && traits::equality_comparable<T>::is_valid
-      && traits::equality_comparable<T>::is_noexcept
-  >
+template <typename T, typename F,
+    typename = void, typename = void, typename = void, typename = void,
+    typename = void, typename = void, typename = void, typename = void>
+struct is_executor_of_impl : false_type
 {
 };
 
 template <typename T, typename F>
-struct is_executor_of_impl :
-  conditional<
-    can_execute<typename add_const<T>::type, F>::value,
-    is_executor_of_impl_base<T, F>,
-    false_type
-  >::type
+struct is_executor_of_impl<T, F,
+  typename enable_if<
+    can_execute<typename add_const<T>::type, F>::value
+  >::type,
+  typename void_type<
+    typename result_of<typename decay<F>::type&()>::type
+  >::type,
+  typename enable_if<
+    is_constructible<typename decay<F>::type, F>::value
+  >::type,
+  typename enable_if<
+    is_move_constructible<typename decay<F>::type>::value
+  >::type,
+#if defined(ASIO_HAS_NOEXCEPT)
+  typename enable_if<
+    is_nothrow_copy_constructible<T>::value
+  >::type,
+  typename enable_if<
+    is_nothrow_destructible<T>::value
+  >::type,
+#else // defined(ASIO_HAS_NOEXCEPT)
+  typename enable_if<
+    is_copy_constructible<T>::value
+  >::type,
+  typename enable_if<
+    is_destructible<T>::value
+  >::type,
+#endif // defined(ASIO_HAS_NOEXCEPT)
+  typename enable_if<
+    traits::equality_comparable<T>::is_valid
+  >::type,
+  typename enable_if<
+    traits::equality_comparable<T>::is_noexcept
+  >::type> : true_type
 {
 };
 
diff --git a/asio/include/asio/execution/mapping.hpp b/asio/include/asio/execution/mapping.hpp
index 43a2733..205d814 100644
--- a/asio/include/asio/execution/mapping.hpp
+++ b/asio/include/asio/execution/mapping.hpp
@@ -254,8 +254,12 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, mapping_t>::is_valid
-          && !traits::query_member<T, mapping_t>::is_valid
-          && traits::static_query<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, mapping_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, thread_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, thread_t>::value();
@@ -267,9 +271,15 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, mapping_t>::is_valid
-          && !traits::query_member<T, mapping_t>::is_valid
-          && !traits::static_query<T, thread_t>::is_valid
-          && traits::static_query<T, new_thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, mapping_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, new_thread_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, new_thread_t>::value();
@@ -281,10 +291,18 @@
   static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, mapping_t>::is_valid
-          && !traits::query_member<T, mapping_t>::is_valid
-          && !traits::static_query<T, thread_t>::is_valid
-          && !traits::static_query<T, new_thread_t>::is_valid
-          && traits::static_query<T, other_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, mapping_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, new_thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, other_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, other_t>::value();
@@ -337,7 +355,9 @@
       const Executor& ex, convertible_from_mapping_t,
       typename enable_if<
         !can_query<const Executor&, thread_t>::value
-          && can_query<const Executor&, new_thread_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, new_thread_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -357,8 +377,12 @@
       const Executor& ex, convertible_from_mapping_t,
       typename enable_if<
         !can_query<const Executor&, thread_t>::value
-          && !can_query<const Executor&, new_thread_t>::value
-          && can_query<const Executor&, other_t>::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<const Executor&, new_thread_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, other_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -452,10 +476,18 @@
   static ASIO_CONSTEXPR thread_t static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, thread_t>::is_valid
-          && !traits::query_member<T, thread_t>::is_valid
-          && !traits::query_free<T, thread_t>::is_valid
-          && !can_query<T, new_thread_t<I> >::value
-          && !can_query<T, other_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, new_thread_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, other_t<I> >::value
       >::type* = 0) ASIO_NOEXCEPT
   {
     return thread_t();
diff --git a/asio/include/asio/execution/outstanding_work.hpp b/asio/include/asio/execution/outstanding_work.hpp
index da58547..edb9c0b 100644
--- a/asio/include/asio/execution/outstanding_work.hpp
+++ b/asio/include/asio/execution/outstanding_work.hpp
@@ -219,8 +219,12 @@
       typename enable_if<
         !traits::query_static_constexpr_member<
             T, outstanding_work_t>::is_valid
-          && !traits::query_member<T, outstanding_work_t>::is_valid
-          && traits::static_query<T, untracked_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, outstanding_work_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, untracked_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, untracked_t>::value();
@@ -233,9 +237,15 @@
       typename enable_if<
         !traits::query_static_constexpr_member<
             T, outstanding_work_t>::is_valid
-          && !traits::query_member<T, outstanding_work_t>::is_valid
-          && !traits::static_query<T, untracked_t>::is_valid
-          && traits::static_query<T, tracked_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, outstanding_work_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, untracked_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, tracked_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, tracked_t>::value();
@@ -292,7 +302,9 @@
       const Executor& ex, convertible_from_outstanding_work_t,
       typename enable_if<
         !can_query<const Executor&, untracked_t>::value
-          && can_query<const Executor&, tracked_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, tracked_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -385,9 +397,15 @@
   static ASIO_CONSTEXPR untracked_t static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, untracked_t>::is_valid
-          && !traits::query_member<T, untracked_t>::is_valid
-          && !traits::query_free<T, untracked_t>::is_valid
-          && !can_query<T, tracked_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, untracked_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, untracked_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, tracked_t<I> >::value
       >::type* = 0) ASIO_NOEXCEPT
   {
     return untracked_t();
diff --git a/asio/include/asio/execution/prefer_only.hpp b/asio/include/asio/execution/prefer_only.hpp
index 9823dad..d9b78a5 100644
--- a/asio/include/asio/execution/prefer_only.hpp
+++ b/asio/include/asio/execution/prefer_only.hpp
@@ -92,7 +92,7 @@
     polymorphic_query_result_type;
 };
 
-template <typename InnerProperty, typename = void>
+template <typename InnerProperty, typename = void, typename = void>
 struct prefer_only_property
 {
   InnerProperty property;
@@ -160,8 +160,12 @@
 struct prefer_only_property<InnerProperty,
     typename enable_if<
       sizeof(prefer_only_value_memfn_helper<InnerProperty>(0)) != 1
-        && !is_same<typename InnerProperty::polymorphic_query_result_type,
-          void>::value
+    >::type,
+    typename enable_if<
+      !is_same<
+        typename InnerProperty::polymorphic_query_result_type,
+        void
+      >::value
     >::type>
 {
   InnerProperty property;
@@ -220,7 +224,9 @@
   prefer(const Executor& ex, const prefer_only<Property>& p,
       typename enable_if<
         is_same<Property, InnerProperty>::value
-          && can_prefer<const Executor&, const InnerProperty&>::value
+      >::type* = 0,
+      typename enable_if<
+        can_prefer<const Executor&, const InnerProperty&>::value
       >::type* = 0)
 #if !defined(ASIO_MSVC) \
   && !defined(__clang__) // Clang crashes if noexcept is used here.
@@ -238,7 +244,9 @@
   query(const Executor& ex, const prefer_only<Property>& p,
       typename enable_if<
         is_same<Property, InnerProperty>::value
-          && can_query<const Executor&, const InnerProperty&>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, const InnerProperty&>::value
       >::type* = 0)
 #if !defined(ASIO_MSVC) \
   && !defined(__clang__) // Clang crashes if noexcept is used here.
diff --git a/asio/include/asio/execution/relationship.hpp b/asio/include/asio/execution/relationship.hpp
index 35f0749..fff8d38 100644
--- a/asio/include/asio/execution/relationship.hpp
+++ b/asio/include/asio/execution/relationship.hpp
@@ -218,8 +218,12 @@
       typename enable_if<
         !traits::query_static_constexpr_member<
             T, relationship_t>::is_valid
-          && !traits::query_member<T, relationship_t>::is_valid
-          && traits::static_query<T, fork_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, relationship_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, fork_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, fork_t>::value();
@@ -232,9 +236,15 @@
       typename enable_if<
         !traits::query_static_constexpr_member<
             T, relationship_t>::is_valid
-          && !traits::query_member<T, relationship_t>::is_valid
-          && !traits::static_query<T, fork_t>::is_valid
-          && traits::static_query<T, continuation_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, relationship_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, fork_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, continuation_t>::is_valid
       >::type* = 0) ASIO_NOEXCEPT
   {
     return traits::static_query<T, continuation_t>::value();
@@ -290,7 +300,9 @@
       const Executor& ex, convertible_from_relationship_t,
       typename enable_if<
         !can_query<const Executor&, fork_t>::value
-          && can_query<const Executor&, continuation_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, continuation_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -383,9 +395,15 @@
   static ASIO_CONSTEXPR fork_t static_query(
       typename enable_if<
         !traits::query_static_constexpr_member<T, fork_t>::is_valid
-          && !traits::query_member<T, fork_t>::is_valid
-          && !traits::query_free<T, fork_t>::is_valid
-          && !can_query<T, continuation_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_member<T, fork_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, fork_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, continuation_t<I> >::value
       >::type* = 0) ASIO_NOEXCEPT
   {
     return fork_t();
diff --git a/asio/include/asio/execution/schedule.hpp b/asio/include/asio/execution/schedule.hpp
index 1262735..95ecc9f 100644
--- a/asio/include/asio/execution/schedule.hpp
+++ b/asio/include/asio/execution/schedule.hpp
@@ -86,7 +86,7 @@
   ill_formed
 };
 
-template <typename S, typename = void>
+template <typename S, typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -97,9 +97,7 @@
 template <typename S>
 struct call_traits<S,
   typename enable_if<
-    (
-      schedule_member<S>::is_valid
-    )
+    schedule_member<S>::is_valid
   >::type> :
   schedule_member<S>
 {
@@ -109,11 +107,10 @@
 template <typename S>
 struct call_traits<S,
   typename enable_if<
-    (
-      !schedule_member<S>::is_valid
-      &&
-      schedule_free<S>::is_valid
-    )
+    !schedule_member<S>::is_valid
+  >::type,
+  typename enable_if<
+    schedule_free<S>::is_valid
   >::type> :
   schedule_free<S>
 {
@@ -123,13 +120,13 @@
 template <typename S>
 struct call_traits<S,
   typename enable_if<
-    (
-      !schedule_member<S>::is_valid
-      &&
-      !schedule_free<S>::is_valid
-      &&
-      is_executor<typename decay<S>::type>::value
-    )
+    !schedule_member<S>::is_valid
+  >::type,
+  typename enable_if<
+    !schedule_free<S>::is_valid
+  >::type,
+  typename enable_if<
+    is_executor<typename decay<S>::type>::value
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = identity);
diff --git a/asio/include/asio/execution/set_done.hpp b/asio/include/asio/execution/set_done.hpp
index 5b45b7e..1ec0d55 100644
--- a/asio/include/asio/execution/set_done.hpp
+++ b/asio/include/asio/execution/set_done.hpp
@@ -83,7 +83,7 @@
   ill_formed
 };
 
-template <typename R, typename = void>
+template <typename R, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -94,9 +94,7 @@
 template <typename R>
 struct call_traits<R,
   typename enable_if<
-    (
-      set_done_member<R>::is_valid
-    )
+    set_done_member<R>::is_valid
   >::type> :
   set_done_member<R>
 {
@@ -106,11 +104,10 @@
 template <typename R>
 struct call_traits<R,
   typename enable_if<
-    (
-      !set_done_member<R>::is_valid
-      &&
-      set_done_free<R>::is_valid
-    )
+    !set_done_member<R>::is_valid
+  >::type,
+  typename enable_if<
+    set_done_free<R>::is_valid
   >::type> :
   set_done_free<R>
 {
diff --git a/asio/include/asio/execution/set_error.hpp b/asio/include/asio/execution/set_error.hpp
index aa70146..f09fded 100644
--- a/asio/include/asio/execution/set_error.hpp
+++ b/asio/include/asio/execution/set_error.hpp
@@ -83,7 +83,7 @@
   ill_formed
 };
 
-template <typename R, typename E, typename = void>
+template <typename R, typename E, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -94,9 +94,7 @@
 template <typename R, typename E>
 struct call_traits<R, void(E),
   typename enable_if<
-    (
-      set_error_member<R, E>::is_valid
-    )
+    set_error_member<R, E>::is_valid
   >::type> :
   set_error_member<R, E>
 {
@@ -106,11 +104,10 @@
 template <typename R, typename E>
 struct call_traits<R, void(E),
   typename enable_if<
-    (
-      !set_error_member<R, E>::is_valid
-      &&
-      set_error_free<R, E>::is_valid
-    )
+    !set_error_member<R, E>::is_valid
+  >::type,
+  typename enable_if<
+    set_error_free<R, E>::is_valid
   >::type> :
   set_error_free<R, E>
 {
diff --git a/asio/include/asio/execution/set_value.hpp b/asio/include/asio/execution/set_value.hpp
index f42b19d..a6834b8 100644
--- a/asio/include/asio/execution/set_value.hpp
+++ b/asio/include/asio/execution/set_value.hpp
@@ -86,7 +86,7 @@
   ill_formed
 };
 
-template <typename R, typename Vs, typename = void>
+template <typename R, typename Vs, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -97,9 +97,7 @@
 template <typename R, typename Vs>
 struct call_traits<R, Vs,
   typename enable_if<
-    (
-      set_value_member<R, Vs>::is_valid
-    )
+    set_value_member<R, Vs>::is_valid
   >::type> :
   set_value_member<R, Vs>
 {
@@ -109,11 +107,10 @@
 template <typename R, typename Vs>
 struct call_traits<R, Vs,
   typename enable_if<
-    (
-      !set_value_member<R, Vs>::is_valid
-      &&
-      set_value_free<R, Vs>::is_valid
-    )
+    !set_value_member<R, Vs>::is_valid
+  >::type,
+  typename enable_if<
+    set_value_free<R, Vs>::is_valid
   >::type> :
   set_value_free<R, Vs>
 {
diff --git a/asio/include/asio/execution/start.hpp b/asio/include/asio/execution/start.hpp
index 194be14..49e3d1c 100644
--- a/asio/include/asio/execution/start.hpp
+++ b/asio/include/asio/execution/start.hpp
@@ -80,7 +80,7 @@
   ill_formed
 };
 
-template <typename R, typename = void>
+template <typename R, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -91,9 +91,7 @@
 template <typename R>
 struct call_traits<R,
   typename enable_if<
-    (
-      start_member<R>::is_valid
-    )
+    start_member<R>::is_valid
   >::type> :
   start_member<R>
 {
@@ -103,11 +101,10 @@
 template <typename R>
 struct call_traits<R,
   typename enable_if<
-    (
-      !start_member<R>::is_valid
-      &&
-      start_free<R>::is_valid
-    )
+    !start_member<R>::is_valid
+  >::type,
+  typename enable_if<
+    start_free<R>::is_valid
   >::type> :
   start_free<R>
 {
diff --git a/asio/include/asio/execution/submit.hpp b/asio/include/asio/execution/submit.hpp
index 719d27e..39c05e9 100644
--- a/asio/include/asio/execution/submit.hpp
+++ b/asio/include/asio/execution/submit.hpp
@@ -125,7 +125,8 @@
   ill_formed
 };
 
-template <typename S, typename R, typename = void>
+template <typename S, typename R, typename = void,
+    typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -136,11 +137,10 @@
 template <typename S, typename R>
 struct call_traits<S, void(R),
   typename enable_if<
-    (
-      submit_member<S, R>::is_valid
-      &&
-      is_sender_to<S, R>::value
-    )
+    submit_member<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    is_sender_to<S, R>::value
   >::type> :
   submit_member<S, R>
 {
@@ -150,13 +150,13 @@
 template <typename S, typename R>
 struct call_traits<S, void(R),
   typename enable_if<
-    (
-      !submit_member<S, R>::is_valid
-      &&
-      submit_free<S, R>::is_valid
-      &&
-      is_sender_to<S, R>::value
-    )
+    !submit_member<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    submit_free<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    is_sender_to<S, R>::value
   >::type> :
   submit_free<S, R>
 {
@@ -166,13 +166,13 @@
 template <typename S, typename R>
 struct call_traits<S, void(R),
   typename enable_if<
-    (
-      !submit_member<S, R>::is_valid
-      &&
-      !submit_free<S, R>::is_valid
-      &&
-      is_sender_to<S, R>::value
-    )
+    !submit_member<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    !submit_free<S, R>::is_valid
+  >::type,
+  typename enable_if<
+    is_sender_to<S, R>::value
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = adapter);
diff --git a/asio/include/asio/prefer.hpp b/asio/include/asio/prefer.hpp
index b885ab4..9936f6d 100644
--- a/asio/include/asio/prefer.hpp
+++ b/asio/include/asio/prefer.hpp
@@ -143,7 +143,9 @@
   ill_formed
 };
 
-template <typename T, typename Properties, typename = void>
+template <typename T, typename Properties, typename = void,
+    typename = void, typename = void, typename = void,
+    typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -154,16 +156,16 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_preferable
-      &&
-      static_require<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_preferable
+  >::type,
+  typename enable_if<
+    static_require<T, Property>::is_valid
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = identity);
@@ -179,18 +181,19 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_preferable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      require_member<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_preferable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    require_member<T, Property>::is_valid
   >::type> :
   require_member<T, Property>
 {
@@ -200,20 +203,22 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_preferable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      !require_member<T, Property>::is_valid
-      &&
-      require_free<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_preferable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    require_free<T, Property>::is_valid
   >::type> :
   require_free<T, Property>
 {
@@ -223,22 +228,25 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_preferable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      !require_member<T, Property>::is_valid
-      &&
-      !require_free<T, Property>::is_valid
-      &&
-      prefer_member<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_preferable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_free<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    prefer_member<T, Property>::is_valid
   >::type> :
   prefer_member<T, Property>
 {
@@ -248,24 +256,28 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_preferable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      !require_member<T, Property>::is_valid
-      &&
-      !require_free<T, Property>::is_valid
-      &&
-      !prefer_member<T, Property>::is_valid
-      &&
-      prefer_free<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_preferable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_free<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !prefer_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    prefer_free<T, Property>::is_valid
   >::type> :
   prefer_free<T, Property>
 {
@@ -275,24 +287,28 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_preferable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      !require_member<T, Property>::is_valid
-      &&
-      !require_free<T, Property>::is_valid
-      &&
-      !prefer_member<T, Property>::is_valid
-      &&
-      !prefer_free<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_preferable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_free<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !prefer_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !prefer_free<T, Property>::is_valid
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = identity);
@@ -309,7 +325,8 @@
 struct call_traits<T, void(P0, P1),
   typename enable_if<
     call_traits<T, void(P0)>::overload != ill_formed
-    &&
+  >::type,
+  typename enable_if<
     call_traits<
       typename call_traits<T, void(P0)>::result_type,
       void(P1)
@@ -340,7 +357,8 @@
 struct call_traits<T, void(P0, P1, PN ASIO_ELLIPSIS),
   typename enable_if<
     call_traits<T, void(P0)>::overload != ill_formed
-    &&
+  >::type,
+  typename enable_if<
     call_traits<
       typename call_traits<T, void(P0)>::result_type,
       void(P1, PN ASIO_ELLIPSIS)
diff --git a/asio/include/asio/query.hpp b/asio/include/asio/query.hpp
index 501b019..39206bc 100644
--- a/asio/include/asio/query.hpp
+++ b/asio/include/asio/query.hpp
@@ -118,7 +118,8 @@
   ill_formed
 };
 
-template <typename T, typename Properties, typename = void>
+template <typename T, typename Properties, typename = void,
+    typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -129,14 +130,13 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      static_query<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    static_query<T, Property>::is_valid
   >::type> :
   static_query<T, Property>
 {
@@ -146,16 +146,16 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      !static_query<T, Property>::is_valid
-      &&
-      query_member<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    !static_query<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    query_member<T, Property>::is_valid
   >::type> :
   query_member<T, Property>
 {
@@ -165,18 +165,19 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      !static_query<T, Property>::is_valid
-      &&
-      !query_member<T, Property>::is_valid
-      &&
-      query_free<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    !static_query<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !query_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    query_free<T, Property>::is_valid
   >::type> :
   query_free<T, Property>
 {
diff --git a/asio/include/asio/require.hpp b/asio/include/asio/require.hpp
index 6114e6b..8e4f586 100644
--- a/asio/include/asio/require.hpp
+++ b/asio/include/asio/require.hpp
@@ -127,7 +127,8 @@
   ill_formed
 };
 
-template <typename T, typename Properties, typename = void>
+template <typename T, typename Properties, typename = void,
+    typename = void, typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -138,16 +139,16 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_requirable
-      &&
-      static_require<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_requirable
+  >::type,
+  typename enable_if<
+    static_require<T, Property>::is_valid
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = identity);
@@ -163,18 +164,19 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_requirable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      require_member<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_requirable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    require_member<T, Property>::is_valid
   >::type> :
   require_member<T, Property>
 {
@@ -184,20 +186,22 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_requirable
-      &&
-      !static_require<T, Property>::is_valid
-      &&
-      !require_member<T, Property>::is_valid
-      &&
-      require_free<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_requirable
+  >::type,
+  typename enable_if<
+    !static_require<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    require_free<T, Property>::is_valid
   >::type> :
   require_free<T, Property>
 {
@@ -208,7 +212,8 @@
 struct call_traits<T, void(P0, P1),
   typename enable_if<
     call_traits<T, void(P0)>::overload != ill_formed
-    &&
+  >::type,
+  typename enable_if<
     call_traits<
       typename call_traits<T, void(P0)>::result_type,
       void(P1)
@@ -239,7 +244,8 @@
 struct call_traits<T, void(P0, P1, PN ASIO_ELLIPSIS),
   typename enable_if<
     call_traits<T, void(P0)>::overload != ill_formed
-    &&
+  >::type,
+  typename enable_if<
     call_traits<
       typename call_traits<T, void(P0)>::result_type,
       void(P1, PN ASIO_ELLIPSIS)
diff --git a/asio/include/asio/require_concept.hpp b/asio/include/asio/require_concept.hpp
index d8785f6..a244037 100644
--- a/asio/include/asio/require_concept.hpp
+++ b/asio/include/asio/require_concept.hpp
@@ -125,7 +125,8 @@
   ill_formed
 };
 
-template <typename T, typename Properties, typename = void>
+template <typename T, typename Properties, typename = void,
+    typename = void, typename = void, typename = void, typename = void>
 struct call_traits
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = ill_formed);
@@ -136,16 +137,16 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_requirable_concept
-      &&
-      static_require_concept<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_requirable_concept
+  >::type,
+  typename enable_if<
+    static_require_concept<T, Property>::is_valid
   >::type>
 {
   ASIO_STATIC_CONSTEXPR(overload_type, overload = identity);
@@ -156,18 +157,19 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_requirable_concept
-      &&
-      !static_require_concept<T, Property>::is_valid
-      &&
-      require_concept_member<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_requirable_concept
+  >::type,
+  typename enable_if<
+    !static_require_concept<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    require_concept_member<T, Property>::is_valid
   >::type> :
   require_concept_member<T, Property>
 {
@@ -177,20 +179,22 @@
 template <typename T, typename Property>
 struct call_traits<T, void(Property),
   typename enable_if<
-    (
-      is_applicable_property<
-        typename decay<T>::type,
-        typename decay<Property>::type
-      >::value
-      &&
-      decay<Property>::type::is_requirable_concept
-      &&
-      !static_require_concept<T, Property>::is_valid
-      &&
-      !require_concept_member<T, Property>::is_valid
-      &&
-      require_concept_free<T, Property>::is_valid
-    )
+    is_applicable_property<
+      typename decay<T>::type,
+      typename decay<Property>::type
+    >::value
+  >::type,
+  typename enable_if<
+    decay<Property>::type::is_requirable_concept
+  >::type,
+  typename enable_if<
+    !static_require_concept<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    !require_concept_member<T, Property>::is_valid
+  >::type,
+  typename enable_if<
+    require_concept_free<T, Property>::is_valid
   >::type> :
   require_concept_free<T, Property>
 {