函数对象
任何定义了函数调用运算符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。
函数调用
仅用于阐述的 令类型
|
(C++11 起) |
std::invoke / std::invoke_r
(C++23 起) 可以按 INVOKE
/ INVOKE<R>
(C++23 起) 的规则以给定实参调用任何可调用 (Callable) 对象。
(C++17)(C++23) |
以给定实参和可能指定的返回类型 (C++23 起)调用任意可调用 (Callable) 对象 (函数模板) |
函数包装器
这些包装器类提供存储任意函数对象的支持。
(C++11) |
任意可复制构造的可调用对象的可复制包装 (类模板) |
(C++23) |
任意可调用对象的仅移动包装,支持给定调用签名中的限定符 (类模板) |
(C++26) |
任意可复制构造的可调用对象的可复制包装,支持给定调用签名中的限定符 (类模板) |
(C++26) |
任意可调用对象的无所有权包装 (类模板) |
(C++11) |
调用空的 std::function 时抛出的异常 (类) |
(C++11) |
从成员指针创建出函数对象 (函数模板) |
恒等
std::identity 是恒等函数对象:它不修改地返回实参。
(C++20) |
返回其未修改的实参的函数对象 (类) |
部分函数应用
std::bind_front 与 std::bind 提供部分函数应用的支持,即绑定实参到函数以创建新函数。
(C++20)(C++23) |
按顺序绑定一定数量的实参到函数对象 (函数模板) |
(C++11) |
绑定一或多个实参到函数对象 (函数模板) |
(C++11) |
指示对象为 std::bind 表达式,或能被用作这种表达式 (类模板) |
(C++11) |
表明一个对象是标准占位符,或者可以用作标准占位符 (类模板) |
在命名空间
std::placeholders 定义 | |
(C++11) |
用作 std::bind 表达式中的未绑定实参的占位符 (常量) |
取反器
std::not_fn 创建对传递给它的可调用对象的结果取反的函数对象。
(C++17) |
创建返回其保有的函数对象的结果之补的函数对象 (函数模板) |
搜索器
提供实现数种字符串搜索算法的搜索器。它们能直接使用或用于 std::search。
(C++17) |
标准 C++ 库搜索算法实现 (类模板) |
(C++17) |
Boyer-Moore 搜索算法实现 (类模板) |
Boyer-Moore-Horspool 搜索算法实现 (类模板) |
引用包装器
引用包装器允许在可复制的函数对象中存储引用实参:
(C++11) |
可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 的引用包装器 (类模板) |
(C++11)(C++11) |
创建具有从其实参推导的类型的 std::reference_wrapper (函数模板) |
(C++20)(C++20) |
获取包装于 std::reference_wrapper 的引用类型 (类模板) |
透明函数对象关联容器和无序关联容器 (C++20 起)提供了异质查找和擦除 (C++23 起)操作,但是它们只有在提供的函数对象类型 标准库中的所有透明函数对象类型都会定义一个嵌套类型 |
(C++14 起) |
运算符函数对象
C++ 针对常用的算术和逻辑运算定义了以下函数对象。
各个 void 特化会根据它们的实参来推导形参类型和返回类型,它们都是透明的。 |
(C++14 起) |
算术运算 | |
实现 x + y 的函数对象 (类模板) | |
(C++14) |
实现 x + y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x - y 的函数对象 (类模板) | |
(C++14) |
实现 x - y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x * y 的函数对象 (类模板) | |
(C++14) |
实现 x * y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x / y 的函数对象 (类模板) | |
(C++14) |
进行 x / y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x % y 的函数对象 (类模板) | |
(C++14) |
实现 x % y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 -x 的函数对象 (类模板) | |
(C++14) |
实现 -x 的函数对象,推导形参类型和返回类型 (类模板特化) |
比较 | |
实现 x == y 的函数对象 (类模板) | |
(C++14) |
实现 x == y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x != y 的函数对象 (类模板) | |
(C++14) |
实现 x != y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x > y 的函数对象 (类模板) | |
(C++14) |
实现 x > y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x < y 的函数对象 (类模板) | |
(C++14) |
实现 x < y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x >= y 的函数对象 (类模板) | |
(C++14) |
实现 x >= y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x <= y 的函数对象 (类模板) | |
(C++14) |
实现 x <= y 的函数对象,推导形参类型和返回类型 (类模板特化) |
逻辑运算 | |
实现 x && y 的函数对象 (类模板) | |
(C++14) |
实现 x && y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x || y 的函数对象 (类模板) | |
(C++14) |
实现 x || y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 !x 的函数对象 (类模板) | |
(C++14) |
实现 !x 的函数对象,推导形参类型和返回类型 (类模板特化) |
位运算 | |
实现 x & y 的函数对象 (类模板) | |
(C++14) |
实现 x & y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x | y 的函数对象 (类模板) | |
(C++14) |
实现 x | y 的函数对象,推导形参类型和返回类型 (类模板特化) |
实现 x ^ y 的函数对象 (类模板) | |
(C++14) |
实现 x ^ y 的函数对象,推导形参类型和返回类型 (类模板特化) |
(C++14) |
实现 ~x 的函数对象 (类模板) |
(C++14) |
实现 ~x 的函数对象,推导形参类型和返回类型 (类模板特化) |
受约束的比较函数对象以下比较函数对象受约束。
这些函数对象都是透明的。
|
(C++20 起) |
辅助项以下仅用于阐释的各项由标准库中的一些组件所用,但它们并不属于标准库接口。
|
(C++26 起) |
旧式绑定器与适配器早期提供功能支持的一些工具都已经被弃用和移除:
|
(C++20 前) |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 185 | C++98 | 使用函数对象就会增加程序效率 | 移除该断言 |
LWG 660 | C++98 | 缺失了执行逐位操作的函数对象 | 已补充 |
LWG 2149 | C++98 | 接受一个或两个实参的函数对象需要提供嵌套类型以表示实参和结果类型 | 不需要 |
LWG 2219 | C++11 | INVOKE 没有正确处理 std::reference_wrapper
|
能正确处理 |
LWG 2420 | C++11 | INVOKE<R> 在 R 是 void 时不会丢弃返回值
|
此时会丢弃返回值 |
LWG 2926 (P0604R0) |
C++11 | 带有返回类型 R 的 INVOKE 操作的形式是INVOKE (f, t1, t2, ..., tN, R)
|
改成INVOKE<R> (f, t1, t2, ..., tN)
|
LWG 3655 | C++11 | 由于 LWG 问题 2219 的解决方案,INVOKE 没有正确处理联合体
|
能正确处理 |