std::basic_const_iterator<Iter>::operator константный итератор
template< /*not-a-const-iterator*/ CI >
requires /*constant-iterator*/<CI> &&
std::convertible_to<Iter const&, CI>
constexpr operator CI() const &;
| (1) | (начиная с C++23) |
template< /*not-a-const-iterator*/ CI >
requires /*constant-iterator*/<CI> &&
std::convertible_to<Iter, CI>
constexpr operator CI() &&;
| (2) | (начиная с C++23) |
Возвращает преобразованный константный итератор, в который базовый итератор current может быть преобразован явно или неявно.
CI удовлетворяет концепции, используемой только для описания, /*not-a-const-iterator*/ тогда и только тогда, когда он не является специализацией basic_const_iterator.
Возвращаемое значение
1)
current
2)
std::move(current)
Пример
#include <iterator>
#include <ranges>
#include <vector>
void foo(std::vector<int>::const_iterator) {}
int main()
{
auto v = std::vector<int>();
{
// ranges::cbegin below returns vector<int>::const_iterator
auto i1 = std::ranges::cbegin(v);
foo(i1); // okay
}
auto t = v | std::views::take_while([](int const x) { return x < 100; });
{
// ranges::cbegin below returns basic_const_iterator<vector<int>::iterator>
auto i2 = std::ranges::cbegin(t);
foo(i2); // error until P2836R1
}
}
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| P2836R1 | C++23 |
basic_const_iterator не следует правилам преобразуемости своего базового типа | предоставлен оператор преобразования |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/basic_const_iterator/operator_constant_iterator