forked from OSchip/llvm-project
[libc++][span] SFINAE span default constructor on Extent == 0
The default constructor of a static span requires _Extent == 0 so SFINAE it out rather than using a static_assert Differential Revision: https://reviews.llvm.org/D71994
This commit is contained in:
parent
d061685a83
commit
79941086fb
|
@ -200,8 +200,8 @@ public:
|
|||
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;
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// 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>
|
||||
|
@ -24,10 +24,7 @@
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <span>
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
|
||||
#include "test_macros.h"
|
||||
|
||||
|
@ -79,5 +80,9 @@ int main(int, char**)
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue