diff --git a/src/json.hpp b/src/json.hpp
index ff58df20..2265457f 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -512,7 +512,7 @@ class basic_json
     /// workaround type for MSVC
     using basic_json_t = basic_json<ObjectType, ArrayType, StringType,
           BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType,
-          AllocatorType>;
+          AllocatorType, JSONSerializer>;
 
   public:
     // forward declarations
@@ -1565,15 +1565,19 @@ class basic_json
     }
 
     // constructor chosen when JSONSerializer::to_json exists for type T
-    template <typename T, enable_if_t<detail::has_to_json<
-                              JSONSerializer, basic_json, uncvref_t<T>>::value and not (detail::is_compatible_object_type<object_t, uncvref_t<T>>::value or
-                                                                                        detail::is_compatible_array_type<basic_json_t, uncvref_t<T>>::value or
-                                                                                        detail::is_compatible_float_type<number_float_t, uncvref_t<T>>::value or
-                                                                                        detail::is_compatible_integer_type<number_integer_t, uncvref_t<T>>::value or
-                                                                                        detail::is_compatible_unsigned_integer_type<number_unsigned_t, uncvref_t<T>>::value or
-                                                                                        std::is_constructible<string_t, uncvref_t<T>>::value or
-                                                                                        std::is_base_of<std::istream, uncvref_t<T>>::value or
-                                                                                        std::is_same<boolean_t, uncvref_t<T>>::value), int> = 0>
+    template <typename T, enable_if_t<detail::conjunction<detail::negation<std::is_same<uncvref_t<T>, basic_json_t>>,
+detail::negation<detail::disjunction<
+                                     detail::is_compatible_array_type<basic_json_t, uncvref_t<T>>,
+                                     detail::is_compatible_object_type<object_t, uncvref_t<T>>,
+                                     detail::is_compatible_float_type<number_float_t, uncvref_t<T>>,
+                                     detail::is_compatible_integer_type<number_integer_t, uncvref_t<T>>,
+                                     detail::is_compatible_unsigned_integer_type<number_unsigned_t, uncvref_t<T>>,
+                                     std::is_constructible<string_t, uncvref_t<T>>,
+                                     std::is_base_of<std::istream, uncvref_t<T>>,
+                                     std::is_same<boolean_t, uncvref_t<T>>>>,
+                                                          detail::has_to_json<
+                              JSONSerializer, basic_json, uncvref_t<T>>
+>::value, int> = 0>
     explicit basic_json(T &&val)
     {
       JSONSerializer<uncvref_t<T>>::to_json(*this, std::forward<T>(val));