名前空間
変種
操作

std::invocable, std::regular_invocable

提供: cppreference.com
< cpp‎ | concepts
ヘッダ <concepts> で定義
template< class F, class... Args >

concept invocable =
  requires(F&& f, Args&&... args) {
    std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
      /* not required to be equality preserving */

  };
(C++20以上)
template< class F, class... Args >
concept regular_invocable = std::invocable<F, Args...>;
(C++20以上)

invocable コンセプトは呼び出し可能な型 F が関数テンプレート std::invoke を用いて引数型のセット Args... で呼びだせることを表します。

regular_invocable コンセプトは invocable コンセプトに加えて invoke 式が等しさを維持することと関数オブジェクトおよび引数をどちらも変更しないことを要求します。

[編集] 等しさの維持

等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。

  • 式への入力がその被演算子から構成される。
  • 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。

等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。

特に明記されない限り、 requires 式で使用されるすべての式は、等しさを維持することと安定であることが要求され、式の評価は非定数の被演算子のみを変更することができます。 定数である被演算子は変更してはなりません。

[編集] ノート

invocableregular_invocable の違いは純粋に意味論上のものです。

乱数ジェネレータは invocable を満たすかもしれませんが regular_invocable を満たすことはできません (こういうコミカルなものは除きます)。