c++ λ函数使用广义捕获不可能吗?

icnyk63a  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(90)

lambda可以很容易地转换为std::function,但当lambda使用带有unique_ptr的通用捕获时,这似乎是不可能的。可能是缺少底层的std::move。是否有解决方法,或者这是一个已知问题?

#include <iostream>
#include <memory>
#include <functional>

using namespace std;

int main()
{
    auto lambdaGeneralizedCaptureOk = [t = std::make_unique<int>(1)]()
      {
        std::cout << *t << std::endl;
      };
    lambdaGeneralizedCaptureOk();
    
    // error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete]’
    std::function<void()> lambdaToFunctionGeneralizedCaptureNok = [t = std::make_unique<int>(2)]()
      {
        std::cout << *t << std::endl;
      };
    lambdaToFunctionGeneralizedCaptureNok();
    
    return 0;
}
kjthegm6

kjthegm61#

是否有解决此问题的方法,或者这是一个已知问题?
std::function要求底层的可调用对象必须是可复制的,因为示例中的lambda对象是只移动的,这是格式错误的。
值得注意的是,C++23引入了move_only_function,它正好可以满足您的需要

std::move_only_function<void()> lambdaToFunctionGeneralizedCaptureNok = 
  [t = std::make_unique<int>(2)]() {
    std::cout << *t << std::endl;
   };

Demo

vulvrdjw

vulvrdjw2#

解决方法是改用std::shared_ptr

相关问题