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以降)
翻訳内容: - `/* see description */` → `/* 説明を参照 */` - `(since C++23)` → `(C++23以降)` HTMLタグ、属性、C++コード(`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 は基底型の変換可能性に従わない 変換演算子を提供