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 を満たすもの)とまったく同じように動作するイテレータアダプタであり、唯一の違いは、間接参照時に基盤イテレータが返す値を不変として変換することです。 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以降)

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 が基底型の変換可能性に従わない 変換演算子が提供される