template<not-a-const-iterator CI>
requires constant-iterator<CI> && convertible_to<Iterator const&, CI>
constexpr operator CI() const&; // (1) C++26
template<not-a-const-iterator CI>
requires constant-iterator<CI> && convertible_to<Iterator, CI>
constexpr operator CI() &&; // (2) C++26
概要
基底イテレータIteratorが変換できる定数イテレータ型への変換演算子。
std::vectorのようなコンテナのイテレータは、対応するconst_iteratorへ暗黙変換できる。この変換演算子によって、そのようなイテレータをラップしたbasic_const_iteratorもまた、同じconst_iteratorへ暗黙変換できる。
- (1) : 左辺値からの変換
- (2) : 右辺値からの変換
テンプレートパラメータ制約
- (1) :
CIが定数イテレータ (constant-iteratorのモデル) であり、const Iterator&からCIへ変換可能であること - (2) :
CIが定数イテレータ (constant-iteratorのモデル) であり、IteratorからCIへ変換可能であること
not-a-const-iterator<CI>はCIがbasic_const_iteratorの特殊化ではない場合にtrueとなる説明専用のコンセプトである。
戻り値
ラップしているイテレータをcurrent_メンバ変数に保持するとして
- (1) :
current_ - (2) :
std::move(current_)
例
#include <iostream>
#include <iterator>
#include <ranges>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
auto t = v | std::views::take_while([](int x) { return x < 3; });
// std::basic_const_iterator<std::vector<int>::iterator>
auto cit = std::ranges::cbegin(t);
// 基底イテレータの変換先である const_iterator へ暗黙変換できる
std::vector<int>::const_iterator i = cit;
std::cout << *i << '\n';
}
出力
1
バージョン
言語
- C++26
処理系
- Clang: 21 ❌
- GCC: 13.4 ✅
- Visual C++: 2022 Update 10 ✅
備考
この変換演算子はC++23に対する欠陥報告 (DR) として追加されたものであり、コンパイラは早期に対応している場合がある。そのため、C++23モードでも使用できる可能性がある。
参照
- P2836R1
std::basic_const_iteratorshould follow its underlying type's convertibility- C++26で、基底イテレータが変換できる定数イテレータ型への変換演算子が追加された。この修正は欠陥報告 (DR) であり、C++23へ遡及して適用される。C++20では
std::ranges::cbegin()が基底イテレータをそのまま返していたため変換できていたコードが、C++23でbasic_const_iteratorを返すようになったことで変換できなくなるという移行時の問題への対応であるため
- C++26で、基底イテレータが変換できる定数イテレータ型への変換演算子が追加された。この修正は欠陥報告 (DR) であり、C++23へ遡及して適用される。C++20では