Namespaces
Variants

Concepts library (since C++20)

From cppreference.net

コンセプトライブラリは、テンプレート引数のコンパイル時検証や型の特性に基づく関数ディスパッチを実行するために使用できる基本ライブラリコンセプトの定義を提供します。これらのコンセプトは、プログラムにおける方程的推論の基盤を提供します。

標準ライブラリのほとんどのコンセプトは、構文要件と意味要件の両方を課します。標準コンセプトは、その構文要件が満たされている場合に 充足される (satisfied) と言われ、充足されており、かつその意味要件(もしあれば)も満たされている場合に モデル化される (modeled) と言われます。

一般に、コンパイラがチェックできるのは構文要件のみです。プログラムの有効性や意味がテンプレート引数のシーケンスがコンセプトをモデル化するかどうかに依存し、コンセプトが満たされているがモデル化されていない場合、または使用時点で意味要件が満たされていない場合、プログラムは不適格となり、 診断不要 となります。

目次

翻訳の説明: - 「Contents」→「目次」に翻訳 - 「See also」→「関連項目」に翻訳 - C++専門用語(Equality preservation、Implicit expression variations、Standard library concepts、Core language concepts、Comparison concepts、Object concepts、Callable concepts)は原文のまま保持 - HTMLタグ、属性、class名、ID、数値はすべて変更せず保持 - 構造とフォーマットは完全に維持

等価性保存

式は、以下の条件において等しい入力が与えられた場合に等しい出力をもたらす場合、 等価性保持 であると言います。

  • 入力はそのオペランドで構成され(必ずしも式を意味的に有効にするわけではありません)、
  • 出力はその結果と、式によるオペランドへのすべての変更(もしあれば)で構成されます

ここで、表現の便宜上、「オペランド」とは、 id-expression 、または std::move std::forward std::declval の呼び出しからなる最大の部分式を指す。

各オペランドのCV修飾と値カテゴリは、その型内の各テンプレート型パラメータがCV非修飾の完全な非配列オブジェクト型を表すと仮定して決定されます。

等価性を保持することが要求されるすべての式は、さらに安定性が要求されます。つまり、同じ入力オブジェクトに対する2回の評価は、それらの入力オブジェクトに対する明示的な変更を介在させることなく、等しい出力を持たなければなりません。

特に明記されていない限り、 requires expression で使用されるすべての式は、 標準ライブラリコンセプト において等価性を保存することが要求され、式の評価はその非定数オペランドのみを変更することができます。定数オペランドは変更してはなりません。

標準ライブラリにおいて、以下のコンセプトは非等価保存(non equality-preserving)の requires 式を持つことが許可されています:

暗黙的な式のバリエーション

定数左辺値オペランドに対して非変更操作である式を使用する requires expression は、異なるセマンティクスを持つ式のバリエーションが明示的に要求されていない限り、与えられたオペランドに対して非定数左辺値または(定数の可能性もある)右辺値を受け入れるその式の追加バリエーションも暗黙的に要求します。

これらの 暗黙的な式のバリエーション は、宣言された式と同じセマンティック要件を満たさなければなりません。実装がこれらのバリエーションの構文をどの程度検証するかは未規定です。

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: 左オペランド `a` を変更する
};
// 式 #1 は暗黙的に、c == d の要件(非変更を含む)を満たす追加の式バリエーションを要求し、
// 以下の式も宣言されたかのように扱われる:
// ------ const == const ------- ------ const == non-const ---
//                                         c  ==           b;
//            c == std::move(d);           c  == std::move(b);
// std::move(c) ==           d;  std::move(c) ==           b;
// std::move(c) == std::move(d); std::move(c) == std::move(b);
// -- non-const == const ------- -- non-const == non-const ---
//           a  ==           d;            a  ==           b;
//           a  == std::move(d);           a  == std::move(b);
// std::move(a) ==           d;  std::move(a) ==           b;
// std::move(a) == std::move(d); std::move(a) == std::move(b);
// 式 #3 は暗黙的に、a = c の要件(第2オペランドの非変更を含む)を満たす
// 追加の式バリエーションを要求し、
// 式 a = b(非定数左辺値バリエーション)と
// a = std::move(c)(定数右辺値バリエーション)が宣言されたかのように扱われる。
// 注: 式 #2 が既に非定数右辺値バリエーション(a == std::move(b))を明示的に要求しているため、
// 式 #3 はそれを暗黙的に要求しなくなる。
// 型 T は上記の概念 C の明示的な構文要件を満たすが、
// 追加の暗黙的な要件は満たさない
// (つまり、T は C を満たすがモデル化しない):
// C<T> を要求するプログラムは不適格(診断不要)。
struct T
{
    bool operator==(const T&) const { return true; }
    bool operator==(T&) = delete;
};

標準ライブラリコンセプト

名前空間 std で定義
コア言語コンセプト
定義済みヘッダー <concepts>
(C++20)
ある型が別の型と同じであることを指定する
(concept)
ある型が別の型から派生していることを指定する
(コンセプト)
型が別の型に暗黙的に変換可能であることを指定する
(concept)
2つの型が共通の参照型を共有することを指定する
(コンセプト)
2つの型が共通の型を共有することを指定する
(コンセプト)
(C++20)
型が整数型であることを指定する
(concept)
型が符号付き整数型であることを指定する
(concept)
型が符号なし整数型であることを指定する
(concept)
型が浮動小数点型であることを指定する
(concept)
型が別の型から代入可能であることを指定する
(コンセプト)
型が交換可能であること、または2つの型が互いに交換可能であることを指定する
(concept)
その型のオブジェクトが破棄可能であることを指定する
(コンセプト)
その型の変数が引数型のセットから構築可能、またはバインド可能であることを指定する
(concept)
ある型のオブジェクトがデフォルト構築可能であることを指定する
(コンセプト)
ある型のオブジェクトがムーブ構築可能であることを指定する
(コンセプト)
型のオブジェクトがコピー構築およびムーブ構築可能であることを指定する
(concept)
比較コンセプト
定義済みヘッダー <concepts>
 (C++20)
型がブール値コンテキストで使用できることを指定する
( 説明専用コンセプト* )
operator == が同値関係であることを指定する
(コンセプト)
その型の比較演算子が全順序を生成することを指定する
(コンセプト)
定義済みヘッダー <compare>
指定された型に対して演算子 <=> が一貫した結果を生成することを指定する
(コンセプト)
オブジェクト概念
ヘッダーで定義 <concepts>
(C++20)
型のオブジェクトがムーブおよびスワップ可能であることを指定する
(concept)
(C++20)
型のオブジェクトがコピー、ムーブ、スワップ可能であることを指定する
(concept)
ある型のオブジェクトがコピー、ムーブ、交換、デフォルト構築可能であることを指定する
(コンセプト)
(C++20)
型がregularであること、すなわち semiregular かつ equality_comparable の両方であることを指定する
(コンセプト)
Callable コンセプト
ヘッダーで定義 <concepts>
指定された引数型のセットで呼び出し可能な型であることを指定する
(concept)
(C++20)
呼び出し可能な型がブール述語であることを指定する
(concept)
(C++20)
呼び出し可能な型が二項関係であることを指定する
(concept)
relation が同値関係を課すことを指定する
(concept)
relation が厳密弱順序を課すことを指定する
(コンセプト)

追加の概念については、 the iterators library the algorithms library および the ranges library で確認できます。

関連項目