std::function
的推导指南
来自 cppreference.cn
< 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-qualified,可选 noexcept,可选左值引用 qualified)时,此重载才参与重载决议。推导类型为 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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 3238 | C++17 | (2) 的行为在以下情况下不明确: F::operator() 具有 &&-限定 |
明确将其从重载决议中排除 |