diff --git a/include/libimp/span.h b/include/libimp/span.h index 93d5f3d..b77cce3 100644 --- a/include/libimp/span.h +++ b/include/libimp/span.h @@ -25,16 +25,16 @@ namespace detail { template using array_convertible = std::is_convertible; +template +using is_array_convertible = + typename std::enable_if::value>::type; + template using compatible_ref = array_convertible::type, T>; template using iter_reference_t = decltype(*std::declval()); -template -using is_array_convertible = - typename std::enable_if::value>::type; - template using is_compatible_iter = typename std::enable_if>::value>::type; @@ -43,6 +43,10 @@ template using is_inconvertible = typename std::enable_if::value>::type; +template +using is_sized_sentinel_for = + is_inconvertible() - std::declval()), std::ptrdiff_t>; + /// @brief Obtain the address represented by p /// without forming a reference to the object pointed to by p. /// @see https://en.cppreference.com/w/cpp/memory/to_address @@ -97,7 +101,7 @@ public: template , - typename = detail::is_compatible_iter, + typename = detail::is_sized_sentinel_for, typename = detail::is_inconvertible> constexpr span(It first, End last) noexcept(noexcept(last - first)) : ptr_ (detail::to_address(first))