Spec-Zone.ru › C++

std::ranges::begin

Определён в заголовочном файле <ranges>
Определён в заголовочном файле <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ begin = /* unspecified */;
}
(начиная с C++20)
(объект-точка настройки)
Сигнатура вызова
template< class T >
    requires /* see below */
constexpr std::input_or_output_iterator auto begin( T&& t );
(начиная с C++20)

Возвращает итератор на первый элемент аргумента.

Если аргумент является lvalue или ranges::enable_borrowed_range<std::remove_cv_t<T>> имеет значение true, вызов ranges::begin эквивалентен выражению:

  1. t + 0, если t имеет тип массива.
    • Если std::remove_all_extents_t<std::remove_reference_t<T>> является неполным типом, вызов ranges::begin некорректен, но диагностика не требуется.
  2. В противном случае — decay-copy(t.begin())(до C++23)auto(t.begin())(начиная с C++23), если это выражение корректно и его тип моделирует std::input_or_output_iterator.
  3. В противном случае — decay-copy(begin(t))(до C++23)auto(begin(t))(начиная с C++23), если T является типом класса или перечисления, это выражение корректно и его тип моделирует std::input_or_output_iterator; при этом смысл begin определяется так, как если бы выполнялся только поиск, зависящий от аргументов.

Во всех остальных случаях вызов ranges::begin некорректен, что может привести к ошибке подстановки, если вызов встречается в непосредственном контексте инстанцирования шаблона.

Объекты-точки настройки

Имя ranges::begin обозначает объект-точку настройки — константный функциональный объект типа класса литерального semiregular. Подробности см. в разделе CustomizationPointObject.

Примечания

Если аргумент является rvalue (то есть T является типом объекта), а ranges::enable_borrowed_range<std::remove_cv_t<T>> имеет значение false, вызов ranges::begin некорректен, что также приводит к ошибке подстановки.

Во всех случаях возвращаемый тип моделирует std::input_or_output_iterator.

Стандарт C++20 требует, чтобы, если нижележащий вызов функции begin возвращает prvalue, возвращаемое значение конструировалось перемещением из материализованного временного объекта. Все реализации напрямую возвращают prvalue. Это требование было исправлено предложением P0849R8, принятым после C++20, чтобы привести стандарт в соответствие с реализациями.

Пример

#include <cassert>
#include <ranges>
#include <vector>
 
int main() 
{
    std::vector v{3, 1, 4};
    auto vi = std::ranges::begin(v);
    auto vci = std::ranges::cbegin(v);
    assert(*vi == 3 and *vi == *vci);
    ++vi;
    ++vci; // OK: vci is modifiable object
    *vi = 42; // OK: vi points to mutable element
    // *vci = 13; // Error: vci points to immutable element

    int a[]{-5, 10, 15};
    auto ai = std::ranges::begin(a); // works with C-arrays as well
    assert(*ai == -5);
    *ai = 42; // OK
}

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применён к Поведение согласно опубликованному стандарту Исправленное поведение
P2602R2 C++20 существует механизм, запрещающий некоторые нечлены begin, найденные посредством ADL такой механизм удалён

См. также

ranges::cbegin
(C++20)
возвращает итератор на начало диапазона только для чтения
(объект-точка настройки)
begincbegin
(C++11)(C++14)
возвращает итератор на начало контейнера или массива
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/begin

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API