Spec-Zone.ru › C++

std::ranges::cbegin

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

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

(до C++23)

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

(начиная с C++23)

Пусть CT равно

  • const std::remove_reference_t<T>&, если аргумент является lvalue (то есть T — тип ссылки на lvalue),
  • const T в противном случае.

Вызов ranges::cbegin эквивалентен выражению ranges::begin(static_cast<CT&&>(t)).

(до C++23)

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

  • std::const_iterator<decltype(U)>(U) для некоторого выражения U, эквивалентного ranges::begin(possibly-const-range(t).

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

(начиная с C++23)

Во всех случаях тип возвращаемого значения моделирует std::input_or_output_iterator и constant-iterator(начиная с C++23).

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

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

Примечания

Для диапазона lvalue e типа T выражение ranges::cbegin(e) эквивалентно

ranges::begin(std::as_const(e)).

(до C++23)
  • ranges::begin(e), если T моделирует constant_range.
  • В противном случае ranges::begin(std::as_const(e)), если const T моделирует constant_range.
  • В противном случае std::basic_const_iterator(ranges::begin(e)).
(начиная с C++23)

Пример

#include <cassert>
#include <ranges>
#include <vector>

int main()
{
    std::vector v{3, 1, 4};
    auto vi = std::ranges::cbegin(v);
    assert(3 == *vi);
    ++vi; // OK, constant-iterator object is mutable
    assert(1 == *vi);
    // *vi = 13; // Error: constant-iterator points to an immutable element

    int a[]{3, 1, 4};
    auto ai = std::ranges::cbegin(a); // cbegin works with C-arrays as well
    assert(3 == *ai and *(ai + 1) == 1);
    // *ai = 13; // Error: read-only variable is not assignable
}

См. также

ranges::begin
(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/cbegin

Spec-Zone.ru

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