Namespaces
Variants

deduction guides for std::function

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
定义于头文件 <functional>
template < class R, class ... ArgTypes >
function ( R ( * ) ( ArgTypes... ) ) - > function < R ( ArgTypes... ) > ;
(1) (C++17 起)
template < class F >
function ( F ) - > function < /*见下文*/ > ;
(2) (C++17 起)
template < class F >
function ( F ) - > function < /*见下文*/ > ;
(3) (C++23 起)
template < class F >
function ( F ) - > function < /*见下文*/ > ;
(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) 的行为不明确
明确将其从重载决议中排除