std::function
的推导指南
来自 cppreference.com
< 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</*见下文*/>; |
(2) | (自 C++17 起) |
template< class F > function( F ) -> function</*见下文*/>; |
(3) | (自 C++23 起) |
template< class F > function( F ) -> function</*见下文*/>; |
(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...)>。
[编辑] 注释
这些推断指南不允许从具有 省略号参数 的函数进行推断,并且类型中的 ... 始终被视为 包展开。
这些推断指南推断出的类型可能会在以后的标准修订中发生变化(特别是,如果 noexcept 支持在以后的标准中添加到 std::function,这可能会发生)。
[编辑] 示例
运行这段代码
#include <functional> int func(double) { return 0; } int main() { std::function f{func}; // guide #1 deduces function<int(double)> int i = 5; std::function g = [&](double) { return i; }; // guide #2 deduces function<int(double)> }
[编辑] 缺陷报告
以下行为更改缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3238 | C++17 | 当 (2) 的行为不清楚时 F::operator() 是 && 限定的 |
已澄清为从重载解析中排除 |