ここでは、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階層にあるページは、以下の方針のもとに執筆している。
- 要件を満たす型を自作するための情報を提供する
- 要件の内容を列挙するだけでなく、その要件を満たす型の最小限の実装例を示す
- 標準ライブラリのどの機能がその要件を要求するかを記載する