Namespaces
Variants

std:: basic_const_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
basic_const_iterator
(C++23)
const_iterator
(C++23)
const_sentinel
(C++23)
make_const_iterator
(C++23)
make_const_sentinel
(C++23)

Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
ヘッダーで定義 <iterator>
template < std:: input_iterator Iter >
class basic_const_iterator ;
(C++23以降)

std::basic_const_iterator は、基盤となるイテレータ(少なくとも LegacyInputIterator または input_iterator を満たすもの)と全く同じように振る舞うイテレータアダプタです。ただし、間接参照を行うと、基盤となるイテレータが返す値が不変(immutable)に変換されます。 std::basic_const_iterator の特殊化は定数イテレータであり、つまり、要素の変更が許可されないため、このイテレータを出力イテレータとして使用することはできません。

目次

メンバー型

メンバー型 定義
iterator_category
(条件付きで存在)

Iter forward_iterator をモデル化する場合:

それ以外の場合、メンバー iterator_category は存在しません。

iterator_concept
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
reference (private) std:: iter_const_reference_t < Iter >
( 説明専用メンバー型* )

メンバーオブジェクト

メンバー名 定義
current (private) base() がコピーまたはムーブする元となる基盤イテレータ
( 説明専用メンバーオブジェクト* )

メンバー関数

新しい basic_const_iterator を構築する
(public member function)
基となるイテレータにアクセスする
(public member function)
指し示す要素にアクセスする
(public member function)
インデックスによる要素へのアクセス
(public member function)
イテレータを進める、または戻す
(public member function)
基となるイテレータが変換可能な任意の定数イテレータに変換する
(public member function)
基となるイテレータを比較する
(public member function)

非メンバー関数

basic_const_iterator と非 basic_const_iterator を比較する
(関数テンプレート)
イテレータを進めるまたは戻す
(関数テンプレート)
(C++23)
2つのイテレータアダプタ間の距離を計算する
(関数テンプレート)
(C++23)
基盤となるイテレータのデリファレンス結果を、関連付けられた右辺値参照型にキャストする
(関数)

ヘルパークラス

イテレータと適合された basic_const_iterator 型の共通型を決定する
(クラステンプレートの特殊化)

ヘルパーエイリアステンプレート

template < std:: input_iterator I >
using const_iterator = /* 説明を参照 */ ;
(C++23以降)
翻訳内容: - `/* see description */` → `/* 説明を参照 */` - `(since C++23)` → `(C++23以降)` HTMLタグ、属性、コード内のテキスト(`template`、`std::input_iterator`、`using`、`const_iterator`など)は翻訳せず、元のフォーマットを保持しています。

I constant-iterator (説明専用コンセプト)をモデルする場合、 const_iterator < I > は型 I を表す。それ以外の場合、 basic_const_iterator < I > となる。

template < std:: semiregular S >
using const_sentinel = /* 説明を参照 */ ;
(C++23以降)

S input_iterator をモデル化する場合、 const_sentinel < S > は型 const_iterator < S > を表します。それ以外の場合、 S です。

ヘルパー関数テンプレート

template < std:: input_iterator T >
constexpr const_iterator < T > make_const_iterator ( I it ) { return it ; }
(C++23以降)
template < std:: semiregular S >
constexpr const_sentinel < S > make_const_sentinel ( S s ) { return s ; }
(C++23以降)

注記

機能テスト マクロ 標準 機能
__cpp_lib_ranges_as_const 202207L (C++23) std::basic_const_iterator
202311L (C++23)
(DR)
std::basic_const_iterator はその基となる型の変換可能性に従うべき

#include <cassert>
#include <iterator>
#include <vector>
int main()
{
    std::vector v{1, 2, 3};
    std::vector<int>::iterator i = v.begin();
    *i = 4;   // OK、v[0] は 4 になる
    i[1] = 4; // OK、*(i + 1) = 4; と同じ
    auto ci = std::make_const_iterator(i);
    assert(*ci == 4);   // OK、基盤オブジェクトを読み取り可能
    assert(ci[0] == 4); // OK、同上
    // *ci = 13;        // エラー:読み取り専用の場所
    // ci[0] = 13;      // エラー:同上
    ci.base()[0] = 42;  // OK、基盤イテレータは書き込み可能
    assert(*ci == 42);  // OK、基盤の場所 v[0] が変更された
}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2836R1 C++23 basic_const_iterator が基底型の変換可能性に従わない 変換演算子を提供