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 эквивалентен выражению:
-
t + 0, еслиtимеет тип массива.- Если std::remove_all_extents_t<std::remove_reference_t<T>> является неполным типом, вызов
ranges::beginнекорректен, но диагностика не требуется.
- Если std::remove_all_extents_t<std::remove_reference_t<T>> является неполным типом, вызов
- В противном случае —
decay-copy(t.begin())(до C++23)auto(t.begin())(начиная с C++23), если это выражение корректно и его тип моделируетstd::input_or_output_iterator. - В противном случае —
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 | такой механизм удалён |
См. также
|
(C++20) | возвращает итератор на начало диапазона только для чтения (объект-точка настройки) |
|
(C++11)(C++14) | возвращает итератор на начало контейнера или массива (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/begin