# `std::function` 的推导指引

< cpp‎ | utility‎ | functional‎ | function

定义于头文件 `<functional>` |  |
template<class R, class... ArgTypes> function(R(*)(ArgTypes...)) -> function<R(ArgTypes...)>; | (1) | (C++17 起)
template<class F> function(F) -> function</*see below*/>; | (2) | (C++17 起)

1) 为 std::function 提供此推导指引以允许从函数推导。
2) 此重载仅若 &F::operator() 在作为不求值运算数时为良构且 decltype(&F::operator()) 拥有形式 R(G::*)(A...) （可选地有 cv 限定，可选地有 noexcept ， 可选地有左值引用限定）而 `G` 为类类型才参与重载决议。推导类型为 std::function<R(A...)> 。

### 注解

这些推导指引所推导的类型可能在之后的标准版本中更改（特别是若在之后的版本中添加 noexcept 支持到 std::function 则这可能发生）。

### 示例

    #include <functional>
    int func(double) { return 0; }
    int main() {
      std::function f{func}; // 指引 #1 推导 function<int(double)>
      int i = 5;
      std::function g = [&](double) { return i; }; // 指引 #2 推导 function<int(double)>
    }

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3238 | C++17 | (2) 的行为不明确 | 使之明确