@@ -28,6 +28,14 @@ class Span
28
28
C* m_data;
29
29
std::size_t m_size;
30
30
31
+ template <class T >
32
+ struct is_Span_int : public std ::false_type {};
33
+ template <class T >
34
+ struct is_Span_int <Span<T>> : public std::true_type {};
35
+ template <class T >
36
+ struct is_Span : public is_Span_int <typename std::remove_cv<T>::type>{};
37
+
38
+
31
39
public:
32
40
constexpr Span () noexcept : m_data(nullptr ), m_size(0 ) {}
33
41
@@ -78,8 +86,19 @@ class Span
78
86
* To prevent surprises, only Spans for constant value types are supported when passing in temporaries.
79
87
* Note that this restriction does not exist when converting arrays or other Spans (see above).
80
88
*/
81
- template <typename V, typename std::enable_if<(std::is_const<C>::value || std::is_lvalue_reference<V>::value) && std::is_convertible<typename std::remove_pointer<decltype (std::declval<V&>().data())>::type (*)[], C (*)[]>::value && std::is_convertible<decltype (std::declval<V&>().size()), std::size_t >::value, int >::type = 0 >
82
- constexpr Span (V&& v) noexcept : m_data(v.data()), m_size(v.size()) {}
89
+ template <typename V>
90
+ constexpr Span (V& other,
91
+ typename std::enable_if<!is_Span<V>::value &&
92
+ std::is_convertible<typename std::remove_pointer<decltype (std::declval<V&>().data())>::type (*)[], C (*)[]>::value &&
93
+ std::is_convertible<decltype(std::declval<V&>().size()), std::size_t>::value, std::nullptr_t>::type = nullptr)
94
+ : m_data(other.data()), m_size(other.size()){}
95
+
96
+ template <typename V>
97
+ constexpr Span (const V& other,
98
+ typename std::enable_if<!is_Span<V>::value &&
99
+ std::is_convertible<typename std::remove_pointer<decltype (std::declval<const V&>().data())>::type (*)[], C (*)[]>::value &&
100
+ std::is_convertible<decltype(std::declval<const V&>().size()), std::size_t>::value, std::nullptr_t>::type = nullptr)
101
+ : m_data(other.data()), m_size(other.size()){}
83
102
84
103
constexpr C* data () const noexcept { return m_data; }
85
104
constexpr C* begin () const noexcept { return m_data; }
0 commit comments