std::ranges...erface::back(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

okay so bestie, we're cracking open std::ranges...erface::back(3) from the C++ Standard Libary manual, and it's giving niche C++20 icon energy πŸ’…βœ¨. Buckle up, because this one is short but the requires clauses are doing the most.

πŸ’– NAME πŸ’–

std::ranges::view_interface::back - std::ranges::view_interface::back

yes, it's the same thing twice, she said what she said 🫢

✨ Synopsis ✨

Here's the signature, and bestie, the requires clauses are lowkey carrying the whole fit:

          constexpr decltype(auto) back()
              requires ranges::bidirectional_range<D> &&
       (1) (since C++20)
          ranges::common_range<D>;
          constexpr decltype(auto) back() const
              requires ranges::bidirectional_range<const D> &&
       (2) (since C++20)
          ranges::common_range<const D>;

The default implementation of the back() member function returns the last element in the view of the derived type. Whether the element is returned by value or by reference depends on the operator* of the iterator type.

  1. Let derived be static_cast<D&>(*this). Equivalent to return *ranges::prev(ranges::end(derived));. The behavior is undefined if empty() is true (i.e. the beginning iterator compares equal to the sentinel), even if the iterator obtained in the same way is dereferenceable. That undefined behavior is not a vibe, so do not play with it πŸ™ˆ
  2. Same as (1), except that derived is static_cast<const D&>(*this).

πŸŽ€ Parameters πŸŽ€

(none) β€” no parameters at all, she's low-maintenance πŸŽ€

🌸 Return value 🌸

The last element in the view. That's the whole return value, periodt ✨.

πŸ¦‹ Notes πŸ¦‹

In C++20, no type derived from std::ranges::view_interface in the standard library provides their own back() member function.

However, following derived types cannot use the default implementations, as they never satisfy neither bidirectional_range nor common_range:

  • std::ranges::basic_istream_view
  • std::ranges::lazy_split_view
  • std::ranges::split_view
  • std::ranges::take_while_view

The inherited back() member function is available for std::ranges::empty_view, but a call to it always results in undefined behavior. Always. Undefined. Behavior. πŸ’€

😭 Example 😭

This section is incomplete Reason: no example

so no example bestie, it's giving unfinished homework 😭

πŸ¦‹ See also πŸ¦‹

  • rbegin β€” returns a reverse iterator to the beginning of a container or array
  • crbegin β€” (function template) (C++14)
  • ranges::rbegin β€” returns a reverse iterator to a range (C++20) (customization point object)
  • ranges::crbegin β€” returns a reverse iterator to a read-only range (C++20) (customization point object)

⭐ Category ⭐

  • Todo no example

source/version/date check, bestie: http://cppreference.com Β· 2024.06.10 Β· std::ranges...erface::back(3) β€” mwah πŸ’‹πŸ’–

πŸ“¦ where this page comes from