std::ranges::range(3)

πŸ“¦
version 2024.07.05 Β· 3 versions
, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::ranges::range(3) πŸ’–

okay so bestie, we're cracking open the C++ Standard Libary manual (yes, that spelling is literally right there, don't @ me πŸ’€) and the whole page is about std::ranges::range. No cap, this is the concept that checks whether a type is range-y enough to iterate over. It's giving main character energy for every container that wants to be looped over. Periodt. πŸ’…


✨ NAME ✨

std::ranges::range β€” std::ranges::range

πŸ¦‹ Synopsis πŸ¦‹

Defined in header <ranges>
template< class T >

concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
(since C++20)
    ranges::end (t);

};

The range concept defines the requirements of a type that allows iteration over its elements by providing an iterator and sentinel that denote the elements of the range. Slay.

🌸 Notes 🌸

A typical range class only needs to provide two functions:

  1. A member function begin() whose return type models input_or_output_iterator.
  2. A member function end() whose return type models sentinel_for<It>, where It is the return type of begin().

Alternatively, they can be non-member functions, to be found by argument-dependent lookup. iykyk 🧚

πŸŽ€ Example πŸŽ€

#include <ranges>

// A minimum range
struct SimpleRange
{
    int* begin();
    int* end();
};
static_assert(std::ranges::range<SimpleRange>);

// not a range: no begin/end
struct NotRange
{
    int t {};
};
static_assert(!std::ranges::range<NotRange>);

// not a range: begin does not return an input_or_output_iterator
struct NotRange2
{
    void* begin();
    int* end();
};
static_assert(!std::ranges::range<NotRange2>);

πŸ’€ Defect reports πŸ’€

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • DR: LWG 3915
  • Applied to: C++20
  • Behavior as published: ranges::begin(t) and ranges::end(t) did not require implicit expression variations
  • Correct behavior: removed the redundant description

That's the whole vibe check βœ….

source: http://cppreference.com β€’ version: 2024.06.10 β€’ page: std::ranges::range(3) β€” bye bestie 🫢

πŸ“¦ where this page comes from