std::function 的推导指引std::function
来自 zh.cppreference.net
| 定义于头文件 <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 起) |
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) 的行为不明确 |
明确将其从重载决议中排除 |