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;
}
uj5u.com熱心網友回復:
是否有解決方法或者這是一個已知問題?
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;
};
演示
uj5u.com熱心網友回復:
解決方法是改用 a std::shared_ptr。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534083.html
標籤:C 拉姆达标准函数
