”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 C++ Lambda 中(尤其是 C++11 中)实现移动捕获?

如何在 C++ Lambda 中(尤其是 C++11 中)实现移动捕获?

发布于2024-12-23
浏览:594

How Can I Achieve Move Capture in C   Lambdas, Especially in C  11?

理解 C Lambda 中的移动捕获

在 C 11 中,捕获 lambda 中的变量通常是通过引用完成的。只要 lambda 存在,此引用就保持活动状态,如果将捕获的变量移出,有时可能会导致意外行为。

A C 14 解决方案:广义 Lambda 捕获

在 C 14 中,广义引入了 lambda 捕获,允许移动捕获。这可以方便地操作仅移动类型,例如唯一指针。

std::make_unique()
    .then([u = std::move(u)] { do_something_with(u); });

C 11 的解决方法

在 C 14 之前,可以使用以下方式模拟移动捕获辅助函数:

方法1:make_rref

此方法创建一个包装类, rref_impl,封装值并管理其生命周期。

template  using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };

然而,在 lambda 中捕获 rref 允许复制它,可能会导致运行时错误。

方法 2:capture() 函数

此方法使用函数,通过引用获取捕获的值并返回一个 lambda,该 lambda 以捕获的值作为参数调用该函数。

template  using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward(v); });

这可以防止复制 lambda 和确保捕获的值移入 lambda 的作用域。

请记住,这些解决方法不如 C 14 中的广义 lambda 捕获那么优雅,但它们提供了一种方法模拟该语言早期版本中的移动捕捉。

最新教程 更多>
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-17
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-04-17
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-04-17
  • Pandas删除行:基于字符串长度和多条件
    Pandas删除行:基于字符串长度和多条件
    在pandas dataframes中的条件行删除 的错误是“ keyError:keyerror:fluges的,则unye的fortive更高很高):要解决此问题,让我们探索一种有条件行删除的替代方法。) 2].index)In-place Operation:You can also per...
    编程 发布于2025-04-17
  • 触发MySQL操作的SELECT语句技巧
    触发MySQL操作的SELECT语句技巧
    在选择语句上触发mySQL action Alternative SolutionHowever, there is a potential workaround for this unique scenario:Create Stored Procedures for SELECTs:Defin...
    编程 发布于2025-04-17
  • 如何根据特定列值整理关联数组行?
    如何根据特定列值整理关联数组行?
    在使用由子阵列组成的关联阵列工作时,按列值通常是基于特定列值重新组织数据的必要条件。这允许更轻松的数据检索和分析。 假设我们有以下格式的子阵列数组: 'a'=> ['id'=> 20,'名称'=>'chimpanzee'], ...
    编程 发布于2025-04-17
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-04-17
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] 剩余_size- = buf_size lines = buffer.split('\ n'....
    编程 发布于2025-04-17
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-17
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-04-17
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-17
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-17
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-04-17
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-17
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-04-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3