(concepts)」は、テンプレートパラメータを制約する機能である。static_assertはどのような値になるべきかを表明するが、コンセプトは型が持つべきインタフェースや特性を表明するコンセプトによって関数オーバーロードやテンプレート特殊化ができるこれまでSFINAEと呼ばれる上級者向けの言語機能を使用していた制約によるオーバーロードが、コンセプトというわかりやすい機能で実現できる。型Tに要求する操作をセミコロン区切りで列挙する。ここでは、メンバ関数draw()を呼び出せることを要求している。テンプレートパラメータTをコンセプトDrawableで制約する。draw()メンバ関数を持っていない}conceptキーワードを使用して、型に対する要求の集合であるコンセプトを定義する。static_assert(SequenceContainer<std::vector<int>>);}コンセプトによるオーバーロードと特殊化テンプレートパラメータを制約するためにはstatic_assertを使うこともできるだろう。static_assertとコンセプトの違いとしては、static_assertは要件を満たさない場合に即座にコンパイルエラーになるが、コンセプトの場合は、要件を満たさない場合にほかの候補を探しに行き、要件を満たす候補が見つからなかった時点でコンパイルエラーとする機能がある。そのため、コンセプトは関数テンプレートのオーバーロード、クラステンプレートや変数テンプレートの特殊化に使用できる。数値の等値比較を行う関数を、整数型か浮動小数点数型かでオーバーロードする。変数テンプレートを、整数型か浮動小数点数型かで特殊化する。3}また、コンセプトはbool型の定数式でもあるため、static_assertと組み合わせてコンパイル時の表明としても使用できる。static_assert(std::integral<T>);}テンプレートパラメータを制約する複数の方法テンプレートパラメータを制約する方法はいくつかある。T>のようにclassやtypenameといったキーワードを使用していたテンプレートパラメータの宣言部分にコンセプトを指定し、テンプレートパラメータTを制約するものだった。この方法は簡易的な制約には便利だが、複数条件を指定できないというトレードオフがある。typenameキーワードの代わりにコンセプトを指定する方法は、これまでに紹介した。詳細な仕様を紹介すると、この構文の場合、コンセプトの第1テンプレート引数がテンプレートパラメータで置き換えられる。T>の場合、std::integral<T>のようにテンプレートパラメータTをstd::integralコンセプトに自動的に指定される。この方法では、複数のテンプレートパラメータをとるコンセプトを使用する場合に注意する必要がある。int>を意味し、「型Tがintから構築できること」を要求する制約となる。OR条件)クラステンプレートでメンバ関数ごとにクラステンプレートパラメータを制約requires節は基本的に、テンプレートパラメータ宣言のあとに記述する。これは、関数テンプレート、クラステンプレート、エイリアステンプレート、変数テンプレートなど、どれでも共通である。requiresでは、ひとつのテンプレートパラメータに対して複数の制約を指定することができる。&&演算子によるAND条件、||演算子によるOR条件によって複数の制約を指定する。3);}また、requires節は、クラステンプレートのテンプレートパラメータを、メンバ関数ごとに制約するためにも使用できる。簡易的なstd::vectorのpush_back()メンバ関数を実装してみよう。簡易実装のため、事前にメモリ領域を確保して再確保はしない。v.print();}出力:HelloWorld関数テンプレートの簡略構文を使用するジェネリックラムダと同様に、関数テンプレートもautoプレースホルダーを使用して、簡易的にテンプレートを使用できる。その場合でも、各パラメータの型をコンセプトで制約できる。(concept)」は、テンプレート引数に対する制約を定義するテンプレートである。true;コンセプトはインスタンス化されない。型Tがメンバ型typeを持つこと。iの変数定義では、T型に対して「コピー構築可能であること」といった要求は行わず、そのような評価はコンパイル時にも行われない。囲まれた本体中には、要件のシーケンスをセミコロン区切りで記述する。あってはならない型Tがrequires式で列挙された要件は定義順に検査され、全ての要件を満たす場合、bool型の定数trueが返る。requirements)」は、式の妥当性を表明する要件である。bが妥当であること};この要件には、任意の定数式を含めることができるが、直接的にそのような方法をとったとしても、その定数式の評価された結果がtrueであること、というような要件にはできない。requirements)」は、型の妥当性を表明する要件である。要求する型名;つまり、先頭にtypenameが記述されていれば型要件である。requirements)」は、式のプロパティを表明する要件である。戻り値型の制約(省略可);この要件は、以下のように検査される:テンプレート引数で型を置き換えて式を評価し、妥当でなければfalseに評価されるnoexceptを指定した場合、式は例外送出の可能性がある場合はfalseに評価される戻り値の型要件が指定された場合、テンプレート引数で型を置き換えて型を評価し、妥当でなければfalseに評価される戻り値型の制約が指定された場合、その要件を満たすこと。満たさなければfalseに評価される。Concept<decltype((E))>;と等価であり、唯一の制約引数として式の型が渡される。T::inner型であること。式x++の戻り値型がIncrementable制約を満たすこと。(intから構築可能であること)。requirements)」は、requires式内でbool型の定数式で制約する要件である。対する追加の制約として使用する。判定系の型特性も指定できる};入れ子要件では、requires式で導入したローカルパラメータを使用できる。ローカルパラメータは特定の値を意味しない「その型のなんらかの値をもつオブジェクト」でしかないため、ローカルパラメータの値を参照しようとする式は不適格となる。parameter)」として宣言することで、requires節を指定することなくテンプレートパラメータを制約できる。コンパイルエラー!制約を満たさない制約パラメータに省略記号がついている場合、パラメータパックと見なされる。単一パラメータのコンセプトをパラメータパックにした場合、パラメータパックの各テンプレートパラメータがそのコンセプトを満たすべきという制約になる。