C++:如何从 lambda 中"un-capture"不可复制的内容(例如 unique_ptr)?
C++: How do I "un-capture" non-copyables (eg. unique_ptr) from a lambda?
考虑以下内容:
unique_ptr<int> foo = make_unique<int>(42);
auto lambda = [bar = move(foo)]()
{
/* Do something with bar */
};
lambda(); // No issues invoking this
cout << "*foo = " << *foo; //Attempts to dereference foo will segfault
捕获诸如unique_ptr之类的事物需要使用std ::移动,以维持unique_ptr的唯一性。但是,当我想在破坏Lambda之后使用相同的智能指针时该怎么办?使用foo将给出一个segfault,而栏则不超出范围。
也许是非正统的lambda使用,我如何将我的unique_ptr返回?它永远被困在lambda中吗?
这可以通过参考捕获。
来解决。auto lambda = [&]()
{
/* Do something with foo */
};
// or
auto lambda = [&foo]()
{
/* Do something with foo */
};
允许您使用foo
,而无需实际移动。
唯一的警告是,要确保Lambda的寿命不超过指针的寿命。如果可以/这样做,那么您应该考虑使用共享所有权方法,例如使用std::shared_ptr
。
但是,当我想在lambda遭到破坏之后使用相同的智能指针时该怎么办?
您使用std::shared_ptr
,不要移动要重复使用的东西。
auto foo = std::make_shared(42);
auto lambda = [bar=foo]()
{
/* Do something with bar */
};
lambda(); // No issues invoking this
cout << "*foo = " << *foo; // also fine
相关文章:
- 为什么 std::unique 不调用 std::sort?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 将数字转换为字母(例如:123 转换为一二三)
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 如何计算数据类型的范围,例如int
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用文件中的文本,例如变量
- 输入值后,如何在一个括号下显示值,例如"{6,7,8,9}
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 初学者问题:如何使用这些晦涩难懂的命令,例如C++中的'RenderWindow'
- C++:将值 int(例如:0x00AAFAD8)转换为指针(指针本身也是 0x00AAFAD8 值)
- 具有多种约束(例如重量、体积等)的背包
- 较高值 n 的分割错误(例如 n=999997)
- 生成"unique"矩阵
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?