Namespaces
Variants

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

来自 zh.cppreference.net
 
 
 
函数对象
函数调用
(C++17)(C++23)
恒等函数对象
(C++20)
透明运算符包装器
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

旧版绑定器和适配器
(直至 C++17*)
(直至 C++17*)
(直至 C++17*)
(直至 C++17*)  
(直至 C++17*)
(直至 C++17*)(直至 C++17*)(直至 C++17*)(直至 C++17*)
(直至 C++20*)
(直至 C++20*)
(直至 C++17*)(直至 C++17*)
(直至 C++17*)(直至 C++17*)

(直至 C++17*)
(直至 C++17*)(直至 C++17*)(直至 C++17*)(直至 C++17*)
(直至 C++20*)
(直至 C++20*)
 
 
定义于头文件 <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 起)
template< class F >
function( F ) -> function</*see below*/>;
(3) (C++23 起)
template< class F >
function( F ) -> function</*see below*/>;
(4) (C++23 起)
1) 为 std::function提供此推导指引,以允许从函数进行推导。
2) 仅当 &F::operator() 被视为非求值操作数时良构,且 decltype(&F::operator()) 的形式为 R(G::*)(A...)(可选地 cv 限定、可选地 noexcept、可选地左值引用限定)时,此重载才参与重载决议。推导出的类型为 std::function<R(A...)>。
3) 仅当 &F::operator() 被视为非求值操作数时良构,且 F::operator() 是一个类型为 显式对象形参函数,其类型形式为 R(G, A...) 或 R(G, A...) noexcept 时,此重载才参与重载决议。推导出的类型为 std::function<R(A...)>。
4) 仅当 &F::operator() 被视为非求值操作数时良构,且 F::operator() 是一个类型为 静态成员函数,其类型形式为 R(A...) 或 R(A...) noexcept 时,此重载才参与重载决议。推导出的类型为 std::function<R(A...)>。

注释

这些推导指引不允许从带有 省略号参数 的函数进行推导,且类型中的 ... 始终被视为 包展开 。

这些推导指南所推导出的类型可能在后续标准修订中发生变更(特别是如果未来标准版本为 std::function 添加了 noexcept 支持时可能出现这种情况)。

示例

#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 当
F :: operator ( ) 具有&&限定符时, (2) 的行为不明确
明确将其从重载决议中排除