diff --git a/stl/inc/xutility b/stl/inc/xutility index 94a29388815..45873dea7c3 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -2636,6 +2636,10 @@ namespace ranges { && requires(_Rng& __r) { _RANGES size(__r); }; // clang-format on + // ALIAS TEMPLATE ranges::range_size_t + template + using range_size_t = decltype(_RANGES size(_STD declval<_Rng&>())); + // STRUCT ranges::view_base struct view_base {}; diff --git a/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp b/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp index 18a386fe6ec..20fac5b0da3 100644 --- a/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp +++ b/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp @@ -66,6 +66,9 @@ concept CanEmpty = requires(R&& r) { ranges::empty(std::forward(r)); }; template concept CanSize = requires(R&& r) { ranges::size(std::forward(r)); }; +template +concept CanSizeType = requires { typename ranges::range_size_t; }; + template concept CanData = requires(R&& r) { ranges::data(std::forward(r)); }; @@ -321,9 +324,11 @@ constexpr bool test_size() { STATIC_ASSERT(!is_valid || std::integral); STATIC_ASSERT(CanSize == is_valid); + STATIC_ASSERT(CanSizeType == is_valid); STATIC_ASSERT(ranges::sized_range == is_valid); if constexpr (is_valid) { STATIC_ASSERT(std::same_as())), Size>); + STATIC_ASSERT(std::same_as, Size>); STATIC_ASSERT(CanEmpty); }