如何运用C++23新规中的std::move_only_function高效处理非拷贝任务?
- 内容介绍
- 文章标签
- 相关推荐
本文共计901个文字,预计阅读时间需要4分钟。
plaintextstd::move_only_function 不是用来升级 std::function 的,它是唯一能接收 std::unique_ptr、std::mutex 或自定义 non-copyable 类型的 lambda 的函数容器——编译器不允许你注入 std::function,这不是写法问题,而是语义冲突。
为什么 std::function 编译失败,而 std::move_only_function 可以
典型错误信息是 error: use of deleted function 'X::X(const X&)'。这不是你的 lambda 写错了,而是 std::function 强制要求目标类型满足 CopyConstructible;而捕获 std::unique_ptr 的 lambda 自动删除了拷贝构造函数。
std::move_only_function 只要求 MoveConstructible,绕过拷贝检查。它底层不预留虚函数表项、不存引用计数字段,也没有拷贝逻辑——所以零开销,也无运行时兜底。
本文共计901个文字,预计阅读时间需要4分钟。
plaintextstd::move_only_function 不是用来升级 std::function 的,它是唯一能接收 std::unique_ptr、std::mutex 或自定义 non-copyable 类型的 lambda 的函数容器——编译器不允许你注入 std::function,这不是写法问题,而是语义冲突。
为什么 std::function 编译失败,而 std::move_only_function 可以
典型错误信息是 error: use of deleted function 'X::X(const X&)'。这不是你的 lambda 写错了,而是 std::function 强制要求目标类型满足 CopyConstructible;而捕获 std::unique_ptr 的 lambda 自动删除了拷贝构造函数。
std::move_only_function 只要求 MoveConstructible,绕过拷贝检查。它底层不预留虚函数表项、不存引用计数字段,也没有拷贝逻辑——所以零开销,也无运行时兜底。

