std::not_fn
来自cppreference.com
| 在标头 <functional> 定义
|
||
| (1) | (C++17 起) (C++20 起为 constexpr) |
|
| (2) | (C++26 起) | |
1) 创建转发调用包装器,返回其所保有的可调用对象的逻辑非。
2) 创建转发调用包装器,返回静态确定的可调用目标的逻辑非。若
ConstFn 为空指针或空成员指针则程序非良构。参数
| f | - | 构造包装器所保有的可调用 (Callable) 对象的来源对象 |
| 类型要求 | ||
- 必须满足可调用 (Callable) 和可移动构造 (MoveConstructible) 。
| ||
-要求 std::is_constructible_v<std::decay_t<F>, F> 是 true
| ||
返回值
1) 未指定类型
成员函数
T 的函数对象。它拥有下列成员。
std::not_fn 返回类型
成员对象
std::not_fn 的返回类型保有一个 std::decay_t<F> 类型的成员对象。
构造函数
| |
(1) | (C++17 起) (C++20 起为 constexpr)(仅用于阐述*) |
| |
(2) | (C++17 起) |
1) 构造函数从
std::forward<F>(f) 直接非列表初始化成员对象(类型是 std::decay_t<F>)。抛出所选构造函数所抛的任何异常。2) 因为要求
std::decay_t<F> 可移动构造 (MoveConstructible) ,所以返回的调用包装器始终可移动构造 (MoveConstructible) ,并且在 std::decay_t<F> 可复制构造 (CopyConstructible) 时也可复制构造 (CopyConstructible) 。
|
显式预置的函数定义使得返回类型不可赋值。 |
(C++20 前) |
|
这些构造函数是否显式预置,以及返回类型是否可赋值是未指定的。 |
(C++20 起) |
成员函数 operator()
| (1) | (C++17 起) (C++20 前) |
|
| (C++20 起) | ||
| (2) | (C++17 起) (C++20 前) |
|
| (C++20 起) | ||
令 fd 为 std::decay_t<F> 类型的成员对象。
|
1) 等价于
return !std::invoke(fd, std::forward<Args>(args)...);2) 等价于
return !std::invoke(std::move(fd), std::forward<Args>(args)...);在调用结果时,若向原先选择的 |
(C++17 起) (C++20 前) |
|
在调用结果时,若向原先选择的 |
(C++20 起) |
2) 以下类型的值。
成员函数
std::not_fn 无状态返回类型
返回类型是可复制构造 (CopyConstructible) 的无状态类。返回类型是否可赋值是未指定的。
成员函数 operator()
| |
(C++26 起) | |
表达式等价于 !std::invoke(ConstFn, std::forward<Args>(args)...)。
异常
1) 不抛出异常,除非
fd 的构造抛出异常。可能的实现
| (1) not_fn |
|---|
|
| (2) not_fn |
|
注解
std::not_fn 的目的是取代 C++03 时代的取反器 std::not1 和 std::not2。
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_not_fn |
201603L |
(C++17) | std::not_fn()
|
202306L |
(C++26) | 允许将可调用对象作为非类型模板实参传递给 std::not_fn
|
示例
运行此代码
#include <cassert>
#include <functional>
bool is_same(int a, int b) noexcept
{
return a == b;
}
struct S
{
int val;
bool is_same(int arg) const noexcept { return val == arg; }
};
int main()
{
// 用于自由函数:
auto is_differ = std::not_fn(is_same);
assert(is_differ(8, 8) == false); // 等价于:!is_same(8, 8) == false
assert(is_differ(6, 9) == true); // 等价于:!is_same(8, 0) == true
// 用于成员函数:
auto member_differ = std::not_fn(&S::is_same);
assert(member_differ(S{3}, 3) == false); // 等价于:S tmp{6}; !tmp.is_same(6) == false
// 保持 noexcept 说明:
static_assert(noexcept(is_differ) == noexcept(is_same));
static_assert(noexcept(member_differ) == noexcept(&S::is_same));
// 用于函数对象:
auto same = [](int a, int b) { return a == b; };
auto differ = std::not_fn(same);
assert(differ(1, 2) == true); // 等价于:!same(1, 2) == true
assert(differ(2, 2) == false); // 等价于:!same(2, 2) == false
#if __cpp_lib_not_fn >= 202306L
auto is_differ_cpp26 = std::not_fn<is_same>();
assert(is_differ_cpp26(8, 8) == false);
assert(is_differ_cpp26(6, 9) == true);
auto member_differ_cpp26 = std::not_fn<&S::is_same>();
assert(member_differ_cpp26(S{3}, 3) == false);
auto differ_cpp26 = std::not_fn<same>();
static_assert(differ_cpp26(1, 2) == true);
static_assert(differ_cpp26(2, 2) == false);
#endif
}
参阅
(C++17 弃用)(C++20 移除) |
构造定制的 std::unary_negate 对象 (函数模板) |
(C++17 弃用)(C++20 移除) |
构造定制的 std::binary_negate 对象 (函数模板) |