std::ranges::cartesian_product_view<First, Vs...>::end
From cppreference.com
 
 
 < cpp | ranges | cartesian product view 
 
 
 C++ 
 Feature test macros (C++20)
 Concepts library (C++20)
 Metaprogramming library (C++11)
 Ranges library (C++20)
 Filesystem library (C++17)
 Concurrency support library (C++11)
 Execution control library (C++26)
Ranges library 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(C++23)(C++23)
  (C++26)(C++26)
(C++23)(C++23)
  (C++26)(C++26)
(C++26)(C++26)
  (C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
  (C++23)(C++23)
(C++23)
(C++23)(C++23)
(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
(C++23)(C++23)
std::ranges::cartesian_product_view 
 
cartesian_product_view::end
 Member functions
 Non-member functions
constexpr iterator<false> end()
 (1) 
 (since C++23) 
    requires ((!/*simple-view*/<First> || ... || !/*simple-view*/<Vs>) &&
constexpr iterator<true> end() const
requires /*cartesian-product-is-common*/<const First, const Vs...>;
 (2) 
 (since C++23) 
requires /*cartesian-product-is-common*/<const First, const Vs...>;
constexpr std::default_sentinel_t end() const noexcept;
 (3) 
 (since C++23) 
Returns an iterator or a sentinel representing the end of the cartesian_product_view.
Let bases_ be the underlying tuple of views.
1,2) Equivalent to
 auto check = [](auto& rng) { return __begin_or_first_end(rng); };
return iterator<__is_const>(/*tuple-transform*/(check, bases_));,
return iterator<__is_const>(/*tuple-transform*/(check, bases_));,
 where:
- __is_const is true for the const-qualified overload, and false otherwise.
 - __is_empty is true if the expression ranges::empty (rng) is true for any rng among the underlying ranges except the first one and false otherwise.
 - __begin_or_first_end(rng) is expression-equivalent to __is_empty ? ranges::begin (rng) : /*cartesian-common-arg-end*/(rng) if rng is the first underlying range and ranges::begin (rng) otherwise.
 
3) Equivalent to: return std::default_sentinel ;.
Contents
[edit] Parameters
(none)
[edit] Return value
An iterator to the element following the last element, or a sentinel which compares equal to the end iterator.
[edit] Example
Run this code
#include <array> #include <format> #include <iostream> #include <ranges> #include <string_view> #include <tuple> using namespace std::literals; int main() { constexpr auto a = std::array { "bool"sv, "goto"sv, "extern"sv, "long"sv }; /* ^ ^ ^ ^ */ constexpr auto v = std::ranges::cartesian_product_view (a[0], a[1], a[2], a[3]); constexpr std::tuple <char const&, char const&, char const&, char const&> last{*(v.end() - 1)}; std::cout << std::format ("{}{}{}{}{}", std::get<0>(last), std::get<1>(last), std::get<2>(last), std::get<3>(last), '\n'); }
Output:
long