From 51d88b2314054ad686b1334625985a509e2f94a7 Mon Sep 17 00:00:00 2001 From: Ole Erik Peistorpet Date: Thu, 30 May 2024 18:46:28 +0200 Subject: [PATCH] static_assert in _detail::Size --- auxi/range_traits.h | 4 +++- util.h | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/auxi/range_traits.h b/auxi/range_traits.h index a787e3d7..a6df2cb9 100644 --- a/auxi/range_traits.h +++ b/auxi/range_traits.h @@ -139,7 +139,9 @@ namespace _detail > constexpr auto Size(Range && r, None...) -> decltype(end(r) - begin(r)) - { return end(r) - begin(r); } + { return end(r) - begin(r); + static_assert(std::is_copy_constructible_v< iterator_t > or !std::is_lvalue_reference_v); + } } } // oel diff --git a/util.h b/util.h index f6e1b0c2..cf6fdfda 100644 --- a/util.h +++ b/util.h @@ -53,9 +53,10 @@ inline constexpr auto as_unsigned = * Ill-formed if `r.size()` is ill-formed and `begin(r)` cannot be subtracted from `end(r)` (SFINAE-friendly) */ template< typename SizedRangeLike > constexpr auto ssize(SizedRangeLike && r) --> std::common_type_t< ptrdiff_t, decltype(as_signed( _detail::Size(r) )) > +-> std::common_type_t { - return std::common_type_t< ptrdiff_t, decltype(as_signed( _detail::Size(r) )) >(_detail::Size(r)); + return std::common_type_t + (_detail::Size( static_cast(r) )); } namespace view