Spec-Zone.ru › C++

std::ranges::end

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

Возвращает сентинел, обозначающий конец диапазона.

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

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

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

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

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

Примечания

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

Если ranges::end(std::forward<T>(t)) корректно, то decltype(ranges::end(std::forward<T>(t))) и decltype(ranges::begin(std::forward<T>(t))) во всех случаях моделируют std::sentinel_for, тогда как T моделирует std::ranges::range.

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

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>

int main()
{
    std::vector<int> vec{3, 1, 4};
    if (std::ranges::find(vec, 5) != std::ranges::end(vec))
        std::cout << "found a 5 in vector vec!\n";
    
    int arr[]{5, 10, 15};
    if (std::ranges::find(arr, 5) != std::ranges::end(arr))
        std::cout << "found a 5 in array arr!\n";
}

Вывод:

found a 5 in array arr!

Отчёты об обнаруженных дефектах

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

Отчёт о дефекте Применяется к Поведение согласно опубликованному стандарту Корректное поведение
P2602R2 C++20 существовал механизм, запрещающий некоторые нешаблонные функции end, найденные с помощью ADL такой механизм удалён

См. также

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

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

Spec-Zone.ru

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