最終更新日時: 2026年02月11日 15時05分02秒 (JST)
yoh が更新

履歴 編集

<functional>

# std::function_ref::推論補助(C++26)

    namespace std {
      template<class F>
      function_ref(F*) -> function_ref<F>; // (1)

      template<auto f>
      function_ref(constant_arg_t<f>) -> function_ref<see below>; // (2)

      template<auto f, class T>
      function_ref(constant_arg_t<f>, T&&) -> function_ref<see below>; // (3)
    }

## 概要

`std::function_ref`クラステンプレートの型推論補助。

## テンプレートパラメータ制約

- (1) : `is_function<F>`が`true`であること。
- (2) : `F`を`remove_pointer_t<decltype(f)>`としたとき、`is_function<F>`が`true`であること。
- (3) : `F`を`decltype(f)`としたとき
  - 型`G`に対して`F`が`R(G::*)(A...) /*cv*/ & noexcept(E)`の形式（参照修飾子`&`は省略可、`E`は`bool`値）、または
  - 型`G`とオブジェクト型`M`に対して`F`が`M G::*`の形式、または
  - 型`G`に対して`F`が`R(*)(G, A...) noexcept(E)`の形式（`E`は`bool`値）であること

## 備考

- (2) : `F`を`remove_pointer_t<decltype(f)>`としたとき、型`function_ref<F>`に推論される。
- (3) : 型`function_ref<R(A...) noexcept(E)>`に推論される。
  - `F`が`M G::*`の形式のとき、`R`は`invoke_result_t<F, T&>`、`A...`は空のパック、`E`は`false`とする。
  - それ以外の形式のときは、テンプレートパラメータ制約の説明を参照。

## 例

    #include <functional>

    int ident(int x) { return x; }

    struct X {
      int data;
      int mf(int x) { return x; }
    };

    int fun(X& obj) { return obj.data; }

    int main()
    {
      // (1) 関数ポインタ
      std::function_ref f1{&ident};

      // (2) 関数ポインタ/NTTP
      std::function_ref f2{std::constant_arg<&ident>};

      // (3a) メンバ関数＋オブジェクト束縛
      X obj{42};
      std::function_ref f3a{std::constant_arg<&X::mf>, obj};
      // (3b) メンバ変数＋オブジェクト束縛
      std::function_ref f3b{std::constant_arg<&X::data>, obj};
      // (3c) 関数ポインタ＋第1引数束縛
      std::function_ref f3c{std::constant_arg<&fun>, obj};
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 参照

- P0792R14 `function_ref`: a type-erased callable reference
- P3774R1 Rename `std::nontype`, and make it broadly useful