Fixed ctors for Container and std::array to accept temporaries.
diff --git a/include/span.h b/include/span.h
index 3c5b53d..7e8c119 100644
--- a/include/span.h
+++ b/include/span.h
@@ -187,7 +187,7 @@
: storage_(&arr[0], extent_type<N>())
{}
- template <size_t N>
+ template <size_t N, class = std::enable_if_t<is_const<element_type>::value>>
constexpr span(const std::array<std::remove_const_t<element_type>, N>& arr)
: storage_(&arr[0], extent_type<N>())
{}
@@ -201,15 +201,14 @@
>
constexpr span(Container& cont) : span(cont.data(), cont.size()) {}
- // NB: the SFINAE here uses .data() as an incomplete/imperfect proxy for the requirement
- // on Container to be a contiguous sequence container.
template <class Container,
- class = std::enable_if_t<!details::is_span<Container>::value &&
+ class = std::enable_if_t<std::is_const<element_type>::value &&
+ !details::is_span<Container>::value &&
std::is_convertible<Container::pointer, pointer>::value &&
std::is_convertible<Container::pointer, decltype(std::declval<Container>().data())>::value>
>
- span(const Container&&) = delete;
-
+ constexpr span(const Container& cont) : span(cont.data(), cont.size()) {}
+
constexpr span(const span& other) noexcept = default;
constexpr span(span&& other) noexcept = default;
@@ -232,10 +231,10 @@
{
}
-#if 0 // TODO
~span() noexcept = default;
constexpr span& operator=(const span& other) noexcept = default;
constexpr span& operator=(span&& other) noexcept = default;
+#if 0 // TODO
// [span.sub], span subviews
template <ptrdiff_t Count>