[libcxx-commits] [PATCH] D71994: SFINAE span default constructor on Extent == 0
Michael Schellenberger Costa via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Dec 30 05:03:40 PST 2019
miscco created this revision.
Herald added subscribers: libcxx-commits, christof.
Herald added a project: libc++.
The default constructor of a static span requires _Extent == 0 so SFINAE it out rather than using a static_assert
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D71994
Files:
libcxx/include/span
libcxx/test/std/containers/views/span.cons/default.fail.cpp
Index: libcxx/test/std/containers/views/span.cons/default.fail.cpp
===================================================================
--- libcxx/test/std/containers/views/span.cons/default.fail.cpp
+++ libcxx/test/std/containers/views/span.cons/default.fail.cpp
@@ -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 at 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;
}
Index: libcxx/include/span
===================================================================
--- libcxx/include/span
+++ libcxx/include/span
@@ -209,8 +209,8 @@
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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71994.235580.patch
Type: text/x-patch
Size: 1748 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20191230/d8917ac1/attachment.bin>
More information about the libcxx-commits
mailing list