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;
}
2条答案
按热度按时间kjthegm61#
是否有解决此问题的方法,或者这是一个已知问题?
std::function
要求底层的可调用对象必须是可复制的,因为示例中的lambda对象是只移动的,这是格式错误的。值得注意的是,C++23引入了
move_only_function
,它正好可以满足您的需要Demo
vulvrdjw2#
解决方法是改用
std::shared_ptr
。