最終更新日時:
が更新

履歴 編集

標準ライブラリ要件

ここでは、C++標準ライブラリの要件 (requirements) を解説する。

要件とは、ライブラリがユーザーの型に対して要求する性質のことである。たとえばstd::vectorの要素型には「コンテナから削除できること」が要求され、std::mapのキー型には「比較できること」が要求される。

要件を知る必要があるのは、おもに以下の場合である。

  • 標準ライブラリに渡す自作の型が、どの性質を満たす必要があるかを確認する
  • 標準ライブラリと同じように使えるコンテナ・アロケータ・イテレータ・クロックなどを自作する

標準ライブラリの要件には、コンセプトとして定義されるものと、規格の文章と表によって定義されるものがある。コンセプトとして定義される要件は、<concepts>・<iterator>・<ranges>などが提供する機能であり、コンパイル時に検査できるため、各コンセプトのリファレンスページで解説する。ここでは、コンセプトとして定義されていない要件を解説する。これらの要件は、満たしていなくてもコンパイルエラーにならないことがあり、満たさない場合の動作は保証されない。

Cpp17で始まる名前の要件は、C++20で同名のコンセプトが追加されたことにともない、区別のために接頭辞が付けられたものである。要件そのものはC++17以前から存在する。名前が似ていても要求する内容は同一ではないため、コンセプトを満たす型がその要件を満たすとは限らない。

型とその式に対する要件

ライブラリ全体で使用される、基本的な要件である。

名前 説明
Cpp17EqualityComparable ==による等値比較ができる
Cpp17LessThanComparable <による大小比較ができる
Cpp17DefaultConstructible デフォルト構築ができる
Cpp17MoveConstructible ムーブ構築ができる
Cpp17CopyConstructible コピー構築ができる
Cpp17MoveAssignable ムーブ代入ができる
Cpp17CopyAssignable コピー代入ができる
Cpp17Destructible 破棄ができる
Cpp17Swappable 2つのオブジェクトを交換できる
Cpp17ValueSwappable イテレータが指す先の値を交換できる
Cpp17NullablePointer ヌル値をもつポインタのように扱える
Cpp17Hash ハッシュ値を求める関数オブジェクトである

型特性の要件

<type_traits>の型特性が満たす要件である。自作の型特性を標準ライブラリと同じ形式で定義する場合にも使用する。

名前 説明
Cpp17UnaryTypeTrait 1つの型の性質を表す型特性である
Cpp17BinaryTypeTrait 2つの型の関係を表す型特性である
Cpp17TransformationTrait 型を変換する型特性である

列挙型・ビットマスク型の要件

標準ライブラリが提供する型のうち、値の集合を表す型が満たす要件である。処理系がこれらの型をどう実装してよいかを規定するものであり、ユーザーがこの要件を満たす型を書くことは想定されていない。

名前 説明
列挙型 入出力・正規表現ライブラリで使用される、列挙型として実装できる型である
ビットマスク型 ビット単位の論理演算によって値を組み合わせられる型である。列挙型・整数型・std::bitsetのいずれでも実装できる

メモリ管理の要件

自作のアロケータを標準ライブラリのコンテナに渡す場合に必要な要件である。

名前 説明
Cpp17Allocator 記憶域の確保・解放を行うアロケータである
アロケータの完全性要件 不完全型に対してアロケータを使用できる

イテレータの要件

コンセプトによるイテレータの分類 (std::input_iteratorなど) とは別に、C++17以前から存在するイテレータの分類である。イテレータを引数に取るアルゴリズムの多くは、いまもこの要件で規定されている。

名前 説明
Cpp17Iterator すべてのイテレータが満たす基本要件
Cpp17InputIterator 読み取り方向に1回だけ走査できる
Cpp17OutputIterator 書き込み方向に1回だけ走査できる
Cpp17ForwardIterator 前方に何度でも走査できる
Cpp17BidirectionalIterator 前方・後方に走査できる
Cpp17RandomAccessIterator 任意の位置へ定数時間で移動できる

コンテナの要件

自作のコンテナを標準ライブラリのアルゴリズムやコンテナアダプタから使えるようにする場合に必要な要件である。

名前 説明
コンテナ要件 すべてのコンテナが満たす基本要件
逆順可能コンテナ要件 逆順に走査できるコンテナの要件
オプショナルなコンテナ操作の要件 提供する場合には定められた意味をもつ操作の要件
アロケータ対応コンテナの要件 アロケータを受け取り、要素の構築・破棄に使うコンテナの要件
シーケンスコンテナ要件 要素を一列に保持するコンテナの要件
連想コンテナ要件 キーの比較によって要素を保持するコンテナの要件
非順序連想コンテナ要件 キーのハッシュ値によって要素を保持するコンテナの要件

コンテナの要素に対する要件

コンテナが要素型に対して要求する要件である。どの操作を使用するかによって、要求される要件が異なる。

名前 説明
Cpp17Erasable コンテナから要素を破棄できる
Cpp17DefaultInsertable 値を指定せずに要素を挿入できる
Cpp17MoveInsertable ムーブによって要素を挿入できる
Cpp17CopyInsertable コピーによって要素を挿入できる
Cpp17EmplaceConstructible 引数から要素を直接構築できる

多次元配列ビューの要件

std::mdspanに渡す、レイアウトとアクセス方法をカスタマイズするための要件である。

名前 説明
レイアウトマッピング要件 多次元のインデックスを1次元の位置へ対応付ける
レイアウトマッピングポリシー要件 要素数からレイアウトマッピングを決定する
アクセサポリシー要件 位置から要素を参照する方法を提供する

アルゴリズムの要件

アルゴリズムに渡す関数オブジェクトが満たすべき要件である。

名前 説明
並列アルゴリズムに渡す関数オブジェクトの要件 並列に実行されるため、データ競合を起こしてはならない
安定なアルゴリズムの要件 等価な要素の相対順序を保つ

時間の要件

自作のクロックを<chrono>の機能に渡す場合に必要な要件である。

名前 説明
Cpp17Clock 現在時刻を取得できるクロックである
Cpp17TrivialClock 時刻の型に対する操作が例外を投げないクロックである

並行・並列の要件

自作のロック機構をstd::lock_guardなどに渡す場合に必要な要件である。

名前 説明
Cpp17BasicLockable ロックとアンロックができる
Cpp17Lockable ロックの試行ができる
Cpp17TimedLockable 時間制限付きでロックの試行ができる
Cpp17SharedLockable 共有ロックができる
Cpp17SharedTimedLockable 時間制限付きで共有ロックができる
mutex型の要件 スレッド間で排他制御を行う
時間制限付きmutex型の要件 時間制限付きのロックを提供するmutex型である
共有mutex型の要件 共有ロックを提供するmutex型である
共有時間制限付きmutex型の要件 時間制限付きの共有ロックを提供するmutex型である

数値・乱数の要件

自作の乱数エンジンや乱数分布を<random>の機能に渡す場合に必要な要件である。

名前 説明
数値型の要件 std::complexとstd::valarrayの要素型が満たす要件
シード列の要件 乱数エンジンの初期状態を生成する
乱数エンジンの要件 状態を持ち、擬似乱数列を生成する
乱数エンジンアダプタの要件 ほかの乱数エンジンの出力を加工する
乱数分布の要件 乱数ビット列を目的の確率分布に変換する
線形代数の値型の要件 <linalg>のアルゴリズムが扱う値型の要件

文字列・書式化・正規表現の要件

文字列・書式化・正規表現の各ライブラリの動作をカスタマイズするための要件である。

名前 説明
文字特性の要件 文字型に対する操作を提供する
BasicFormatter 型を書式化する方法を提供する
Formatter 書式化の指定を解析し、型を書式化する方法を提供する
正規表現traitsの要件 正規表現の文字の分類・変換を提供する

入出力の要件

入出力ライブラリが使用する型が満たす要件である。

名前 説明
fpos型の要件 ストリーム中の位置を表す型である

運営方針

requirements階層にあるページは、以下の方針のもとに執筆している。

  • 要件を満たす型を自作するための情報を提供する
    • 要件の内容を列挙するだけでなく、その要件を満たす型の最小限の実装例を示す
    • 標準ライブラリのどの機能がその要件を要求するかを記載する