static constexpr size_type extent = _Extent;
// [span.cons], span constructors, copy, assignment, and destructor
- _LIBCPP_INLINE_VISIBILITY constexpr span() noexcept : __data{nullptr}
- { static_assert(_Extent == 0, "Can't default construct a statically sized span with size > 0"); }
+ template <size_t _Sz = _Extent, enable_if_t<_Sz == 0, nullptr_t> = nullptr>
+ _LIBCPP_INLINE_VISIBILITY constexpr span() noexcept : __data{nullptr} {}
constexpr span (const span&) noexcept = default;
constexpr span& operator=(const span&) noexcept = default;
// constexpr span() noexcept;
//
// Remarks: This constructor shall not participate in overload resolution
-// unless Extent <= 0 is true.
+// unless Extent == 0 || Extent == dynamic_extent is true.
#include <span>
int main(int, char**)
{
- std::span<int, 2> s; // expected-error-re@span:* {{static_assert failed{{( due to requirement '.*')?}} "Can't default construct a statically sized span with size > 0"}}
-
-// TODO: This is what I want:
-// eXpected-error {{no matching constructor for initialization of 'std::span<int, 2>'}}
+ std::span<int, 2> s; // expected-error {{no matching constructor for initialization of 'std::span<int, 2>'}}
return 0;
}
#include <span>
#include <cassert>
#include <string>
+#include <type_traits>
#include "test_macros.h"
checkCV();
- return 0;
+ static_assert( std::is_default_constructible_v<std::span<int, std::dynamic_extent>>, "");
+ static_assert( std::is_default_constructible_v<std::span<int, 0>>, "");
+ static_assert(!std::is_default_constructible_v<std::span<int, 2>>, "");
+
+ return 0;
}