C++23中std::move_only_function的详解与处理非拷贝型可调用对象的关系如何?

2026-04-24 19:110阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计913个文字,预计阅读时间需要4分钟。

C++23中std::move_only_function的详解与处理非拷贝型可调用对象的关系如何?

markdownstd::move_only_function 不是 std::function 的轻量版,而是语义上完全不同的类型:

为什么 std::function 编译失败而 std::move_only_function 可以?

典型错误是捕获 std::unique_ptr 的 lambda 赋给 std::function,报错:error: use of deleted function 'X::X(const X&)'。这不是你代码有 bug,是语义冲突——std::function 要求目标满足 CopyConstructible,但带 std::unique_ptr 捕获的 lambda 自动删除了拷贝构造函数。

std::move_only_function 只要求 MoveConstructible,绕过该约束。它底层不走虚函数表的拷贝逻辑,而是用移动构造 + 堆分配(或小缓冲)存目标。

阅读全文
标签:C

本文共计913个文字,预计阅读时间需要4分钟。

C++23中std::move_only_function的详解与处理非拷贝型可调用对象的关系如何?

markdownstd::move_only_function 不是 std::function 的轻量版,而是语义上完全不同的类型:

为什么 std::function 编译失败而 std::move_only_function 可以?

典型错误是捕获 std::unique_ptr 的 lambda 赋给 std::function,报错:error: use of deleted function 'X::X(const X&)'。这不是你代码有 bug,是语义冲突——std::function 要求目标满足 CopyConstructible,但带 std::unique_ptr 捕获的 lambda 自动删除了拷贝构造函数。

std::move_only_function 只要求 MoveConstructible,绕过该约束。它底层不走虚函数表的拷贝逻辑,而是用移动构造 + 堆分配(或小缓冲)存目标。

阅读全文
标签:C