std::function 的推导指引
来自cppreference.com
| 在标头 <functional> 定义
|
||
| |
(1) | (C++17 起) |
| |
(2) | (C++17 起) |
| |
(3) | (C++23 起) |
| |
(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}; // 指引 #1 推导 function<int(double)>
int i = 5;
std::function g = [&](double) { return i; }; // 指引 #2 推导 function<int(double)>
}
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3238 | C++17 | (2) 的行为在 F::operator() 为 && 限定时不明确
|
明确为从重载决议排除 |