如何在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
相关产品推荐
相关产品推荐

