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

如何在C++中正确转发mutable lambda并解决对应编译报错问题

报错原因
  • lambda默认的operator()是const成员函数,因此在未加mutable修饰的lambda内部,所有捕获的变量都会被视为const对象
  • 被mutable修饰的lambda,其operator()没有const限定,仅能在非const的lambda对象上调用
  • 你原有代码中foo返回的lambda没有加mutable修饰,调用std::invoke时传入的callback是const左值引用,无法匹配mutable lambda的非const调用运算符,因此触发编译报错
解决方案

给foo返回的lambda添加mutable修饰即可,若要进一步兼容可调用对象的右值调用场景,还可以对callback也做完美转发,修改后的代码如下:

template <class F>
auto foo(F&& fun)
{
    // 给返回的lambda添加mutable修饰
    return [callback = std::forward<F>(fun)](auto&&... args) mutable {
        // 对callback也做完美转发,兼容更多调用场景
        std::invoke(std::forward<decltype(callback)>(callback), std::forward<decltype(args)>(args)...);
    };
}

内容的提问来源于stack exchange,提问作者Lorah Attkins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:03