You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++23是否有支持const/ref/noexcept的可复制函数包装器?若无是否有替代库?

支持复制的增强型函数包装器方案

C++23的std::move_only_function特性

C++23引入了std::move_only_function,它支持隐式this参数的const、左/右值引用限定,以及函数本身的noexcept(true/false)特性匹配。而旧版的std::function缺少这些精细的重载支持:

#include <functional>

int main(){
    std::function<void()>([]noexcept(true){});          // okay ✓
    std::function<void()>([]noexcept(false){});         // okay ✓
    std::function<void()noexcept>([]noexcept(true){});  // not supported
    std::function<void()noexcept>([]noexcept(false){}); // not supported

    std::move_only_function<void()>([]noexcept(true){});          // okay ✓
    std::move_only_function<void()>([]noexcept(false){});         // okay ✓
    std::move_only_function<void()noexcept>([]noexcept(true){});  // okay ✓
    std::move_only_function<void()noexcept>([]noexcept(false){}); // fails ✓

    std::function<void()>([i=0]{});             // okay ✓
    std::function<void()>([i=0]mutable{});      // okay ✓
    std::function<void()const>([i=0]{});        // not supported
    std::function<void()const>([i=0]mutable{}); // not supported

    std::move_only_function<void()>([i=0]{});             // okay ✓
    std::move_only_function<void()>([i=0]mutable{});      // okay ✓
    std::move_only_function<void()const>([i=0]{});        // okay ✓
    std::move_only_function<void()const>([i=0]mutable{}); // fails ✓
}

std::move_only_function的局限性:不可复制

正如其名,std::move_only_function不支持复制语义,无法直接存入需要复制操作的容器(如std::vector):

#include <functional>
#include <vector>

int main(){
    auto const fn = []{};

    std::function<void()> a = fn;
    std::vector<std::function<void()>> a_list{a, a};

    std::move_only_function<void()> b = fn;
    std::vector<std::move_only_function<void()>> b_list{b, b}; // error
}

支持复制的替代方案

C++23标准库中没有直接提供同时具备std::move_only_function的增强调用特性(const/noexcept/引用限定)且支持复制的函数包装器。可以通过以下第三方库实现需求:

  • Boost.Function2:Boost库的扩展组件,完整支持const、noexcept以及引用限定符的重载匹配,同时保持可复制性,兼容C++11及以上标准,拥有被包装函数的所有权。
  • Abseil AnyInvocable:Abseil库的AnyInvocable支持所有调用特性(包括const、noexcept),支持复制操作,且持有被包装对象的所有权。
  • folly::Function:Facebook Folly库中的Function实现了类似的增强功能,支持noexcept和引用限定符,同时具备复制语义。

这些库的核心优势是在保留std::move_only_function的精细调用匹配能力基础上,实现了复制语义,满足"拥有函数所有权且可复制"的需求。


内容的提问来源于stack exchange,提问作者Benjamin Buch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:05:02