C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 程序支持工具
- std::initializer_list
- 函数对象
- std::less
- std::mem_fn
- std::bind
- std::function
- std::bad_function_call
- std::is_bind_expression
- std::is_placeholder
- std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N
- std::invoke
- std::not_fn
- std::bind_front
- std::boyer_moore_searcher
- std::default_searcher
- std::identity
- std::reference_wrapper
- std::ref, std::cref
- std::unwrap_reference, std::unwrap_ref_decay
- std::plus
- std::minus
- std::negate
- std::multiplies
- std::divides
- std::modulus
- std::logical_and
- std::logical_or
- std::logical_not
- std::equal_to
- std::not_equal_to
- std::greater
- std::greater_equal
- std::less_equal
- std::bit_and
- std::bit_or
- std::bit_xor
- std::bit_not
- std::boyer_moore_horspool_searcher
- std::unary_function
- std::binary_function
- std::ptr_fun
- std::pointer_to_unary_function
- std::pointer_to_binary_function
- std::mem_fun_t, std::mem_fun1_t, std::const_mem_fun_t, std::const_mem_fun1_t
- std::not1
- std::not2
- std::bind1st, std::bind2nd
- std::mem_fun_ref_t, std::mem_fun1_ref_t, std::const_mem_fun_ref_t, std::const_mem_fun1_ref_t
- std::unary_negate
- std::binary_negate
- std::less<void>
- std::apply
- 库特性测试宏 (C++20)
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- 格式化库 (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- 变参数函数
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注释
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
std::bind_front
定义于头文件 <functional>
|
||
template <class F, class... Args> constexpr /*unspecified*/ bind_front( F&& f, Args&&... args ); |
(C++20 起) | |
函数模板 bind_front
为 f
生成转发调用包装。调用此包装等价于绑定首 sizeof...(Args) 个参数到 args
再调用 f
。
换言之 std::bind_front(f, bound_args...)(call_args...) 等价于 std::invoke(f, bound_args..., call_args....) 。
若下列任一为 false 则程序为非良构:
- std::is_constructible_v<std::decay_t<F>, F>
- std::is_move_constructible_v<std::decay_t<F>>
- (std::is_constructible_v<std::decay_t<Args>, Args> && ...)
- (std::is_move_constructible_v<std::decay_t<Args>> && ...)
参数
f | - | 将绑定某些参数到的可调用 (Callable) 对象(函数对象、指向函数指针、到函数的引用、指向成员函数指针或指向数据成员指针) |
args | - | 参数列表,绑定首 sizeof...(Args) 个参数到 f
|
类型要求 | ||
-std::decay_t<F> 与 std::decay_t<Args>... 中的每个类型 必须满足可移动构造 (MoveConstructible) 的要求。
|
返回值
未指定的 T
类型函数对象,除了二次以相同参数调用 std::bind_front
返回的类型相同。
返回的对象(调用包装)有下列属性:
std::bind_front 返回类型
成员对象
返回的对象表现为如同它保有从 std::forward<F>(f) 直接非列表初始化的 std::decay_t<F> 类型成员对象 fd
,以及用 std::tuple<std::decay_t<Args>...>(std::forward<Args>(args)...) 构造的 std::tuple 对象 tup
(这会解包任何 std::reference_wrapper ),除了返回对象的赋值行为未指定,且名称只为说明。
构造函数
std::bind_front
的构造函数表现为其赋值/移动构造函数进行逐成员复制/移动。若其所有成员对象(指定如上)为可复制构造 (CopyConstructible) )则它为 可复制构造 (CopyConstructible) ,否则为可移动构造 (MoveConstructible) 。
成员函数 operator()
给定从先前调用 bind_front(f, args...)
获得的对象 G
,在函数调用表达式 g(call_args...) 中调用指代 G
的泛左值 g
时,发生存储对象的调用,如同用
std::invoke(g.fd, std::get<Ns>(g.tup)..., call_args...)
,其中
-
Ns
是整数包0, 1, ..., (sizeof...(Args) - 1)
-
g
若在调用表达式中是左值,则在 std::invoke 表达式中是左值,否则是右值。从而 std::move(g)(call_args...) 能移动绑定的参数到调用中,而 g(call_args...) 会复制。
若 g
拥有 volatile 限定类型则行为未定义。
若其所调用的 std::invoke 表达式为 noexcept 则成员 operator()
为 noexcept (换言之,它保持底层调用运算符的异常规定)。
异常
仅若构造存储的函数对象或任何绑定的参数时抛出才会抛出。
注解
有意令此函数取代 std::bind 。不同于 std::bind
,它不支持任意参数重排,而且不特别处理嵌套的 bind 表达式或 std::reference_wrapper 。另一方面,它注重调用包装对象的值类别,并传播底层调用运算符的异常规定。
如 std::invoke 中描述,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是到要访问其成员的对象的引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr )。
复制或移动给 std::bind_front
的参数,而决不按引用传递,除非用 std::ref 或 std::cref 包装它们。
示例
#include <functional> #include <iostream> int minus(int a, int b) { return a - b; } int main() { auto fifty_minus = std::bind_front(&minus, 50); std::cout << fifty_minus(3); }
输出:
47
参阅
(C++11) |
绑定一或多个实参到函数对象 (函数模板) |
(C++11) |
从成员指针创建出函数对象 (函数模板) |