C++/標準ライブラリ/コンセプトライブラリ
表示
18 Concepts library (concepts)
[編集]この章では、C++プログラムがテンプレート引数のコンパイル時検証や型のプロパティに基づく関数ディスパッチを実行するために使用できるライブラリコンポーネントについて説明します。これらのコンセプトの目的は、プログラムにおける方程式的推論の基盤を確立することです。
18.1 General (concepts.general)
[編集]- 説明
- この節では、C++プログラムがテンプレート引数のコンパイル時検証や型のプロパティに基づく関数ディスパッチを実行するために使用できるライブラリコンポーネントについて説明します。
- これらのコンセプトの目的は、プログラムにおける方程式的推論の基盤を確立することです。
- 小節の内容
- 次の小節では、言語関連のコンセプト、比較コンセプト、オブジェクトコンセプト、呼び出し可能なコンセプトについて説明します。これらの内容は表41に要約されています。
Table 41: Fundamental concepts library summary (tab:concepts.summary)
[編集]小節 ヘッダー 18.2 Equality preservation 18.4 Language-related concepts <concepts>
18.5 Comparison concepts 18.6 Object concepts 18.7 Callable concepts
18.2 Equality preservation (concepts.equality)
[編集]- 等価性保持
- 式が等価性を保持するとは、等しい入力に対して等しい出力を生成することです。式の入力はそのオペランドのセットであり、出力は式の結果と式によって変更されるすべてのオペランドです。
- この小節の目的で、式のオペランドは次のもので構成される最大の部分式です:
- id-expression (7.5.4)
- ライブラリ関数テンプレート
std::move
,std::forward
,std::declval
(22.2.4, 22.2.6)の呼び出し
- 例1
- 式
a = std::move(b)
のオペランドはa
とstd::move(b)
です。
- 有効な入力
- すべての入力値が特定の式に対して有効である必要はありません。
- 例2
- 整数
a
とb
に対して、a / b
の式はb
が 0 のときに定義されません。これは、式a / b
が等価性を保持することを妨げません。
- 式のドメインは、式が定義される必要がある入力値のセットです。
- すべての入力値が特定の式に対して有効である必要はありません。
- 安定性の要求
- 等価性を保持する必要がある式は、さらに安定している必要があります。すなわち、同じ入力オブジェクトに対して2回の評価が等しい出力を持つことが要求されます。
- 注1
- この要求は、オブジェクトの現在の値を等価性を保持する式を介して観察された以前の値に基づいて推論することを許可します。
- 等価性を保持する必要がある式は、さらに安定している必要があります。すなわち、同じ入力オブジェクトに対して2回の評価が等しい出力を持つことが要求されます。
- ライブラリの要求式
- ライブラリの節で
requires-expression
内で宣言された式は、等価性を保持することが要求されますが、「等価性を保持する必要はない」というコメントが付いているものは除きます。
- ライブラリの節で
- 修正の有無
- 入力の値を等価性を保持する式に観察可能な方法で変更する可能性がある式は、その入力を変更すると言います。
- 式の変動
requires-expression
において、ある定数左辺値オペランドに対して非修正の式が宣言されている場合、そのオペランドに対する非定数左辺値または右辺値を受け入れる追加の変動も要求されます。- 例3
template<class T> concept C = requires(T a, T b, const T c, const T d) { c == d; // #1 a = std::move(b); // #2 a = c; // #3 };
- 上記の例では:
- 式 #1 はどちらのオペランドも変更しません。#2 は両方のオペランドを変更し、#3 は最初のオペランド
a
のみを変更します。 - 式 #1 は
c == d
の要求(非修正を含む)を満たす追加の変動を暗黙的に要求します。 - 式 #3 は
a = c
の要求を満たす追加の変動を暗黙的に要求します。
- 式 #1 はどちらのオペランドも変更しません。#2 は両方のオペランドを変更し、#3 は最初のオペランド
- 例4
struct T { bool operator==(const T&) const { return true; } bool operator==(T&) = delete; };
- T は C の暗黙的な要求を満たしていないため、C を満たすが C をモデル化していません。
18.4 Language-related concepts (concepts)
[編集]- 言語関連のコンセプト
<concepts>
ヘッダーに含まれ、テンプレートプログラミングで使用される基本的なコンセプトを提供します。
18.5 Comparison concepts
[編集]- 比較コンセプト
- 比較操作(例:
==
,<
)をサポートするためのコンセプトです。
18.6 Object concepts
[編集]- オブジェクトコンセプト
- オブジェクトや型に関連するプロパティを定義するためのコンセプトです。
18.7 Callable concepts
[編集]- 呼び出し可能なコンセプト
- 関数やファンクタ、ラムダ式などの呼び出し可能なオブジェクトを定義するためのコンセプトです。