无法捕获 lambda 中的静态变量[重复]

2024-03-30

这看起来很奇怪,我可以捕获静态变量,但前提是该变量未在捕获列表中指定,即它隐式捕获它。

int main()
{
    int captureMe = 0;
    static int captureMe_static = 0;

    auto lambda1 = [&]() { captureMe++; };  // Works, deduced capture
    auto lambda2 = [&captureMe]() { captureMe++; }; // Works, explicit capture
    auto lambda3 = [&] () { captureMe_static++; };  // Works, capturing static int implicitly
    auto lambda4 = [&captureMe_static] { captureMe_static++; }; // Capturing static in explicitly:  
                                                                // Error: A variable with static storage duration 
                                                                // cannot be captured in a lambda

    // Also says "identifier in capture must be a variable with automatic storage duration declared
    // in the reaching scope of the lambda

    lambda1(); lambda2(); lambda3();    // All work fine

    return 0;
}

我不明白,第三次和第四次捕获应该是等效的,不是吗?在第三个中,我没有捕获具有“自动存储持续时间”的变量

编辑:我认为这个问题的答案是它永远不会捕获静态变量,所以:

auto lambda = [&] { captureMe_static++; };   // Ampersand says to capture any variables, but it doesn't need to capture anything so the ampersand is not doing anything
auto lambda = [] { captureMe_static++; };  // As shown by this, the static doesn't need to be captured, and can't be captured according to the rules.

具有静态存储持续时间的变量不需要捕获,因此无法捕获。您可以简单地在 lambda 中使用它。

自动变量存在一个问题:在其他语言中,闭包只会在封闭范围内存储对变量的引用,而在 C++ 中,lambda 无法延长自动变量的生命周期,因此可能会消失范围,在 lambda 中留下悬空引用。因此,C++ 允许您选择是通过复制还是通过引用捕获自动变量。但如果变量是静态的,那么这个问题就不会出现; lambda 的行为就像通过引用捕获它一样。

如果您确实想通过以下方式捕获静态变量value然后使用 C++14 init-capture 语法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法捕获 lambda 中的静态变量[重复] 的相关文章

  • 如何通过 C# 检测字符串中的阿拉伯语或波斯语字符?

    我想检测Arabic or Persian字符串中的字符 例如 在字符串中搜索 15 Aspire ES1 533 C4UH 并返回true 并在字符串中搜索 Aspire ES1 533 C4UH 并返回false string patt
  • 如何使用C#检测IIS版本?

    如何使用C 检测IIS版本 更新 我的意思是来自 winapp 实际上该场景是开发一个自定义安装程序 想要检查已安装 IIS 的版本以调用适当的 api 在这里找到了答案 链接文本 http forums iis net p 1162404
  • 未初始化成员的警告在 C++11 上消失

    我编译这个简单的程序 include
  • 在长时间运行期间发送 Windows 消息?

    我在运行的大型操作中收到以下消息 CLR 无法转换 从 COM 上下文 0x1fe458 到 COM 上下文 0x1fe5c8 60 秒 这 拥有目的地的线程 上下文 公寓最有可能 要么进行非抽水等待 要么 处理很长时间的运行 无需泵送 W
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 将 XML 转换为 JSON 时保留 json:Array 属性

    我有一段 XML 看起来像
  • 同步和异步 API

    我正在开发一个库 它提供一些耗时的服务 我需要每个 API 有两个版本 一个用于同步函数调用 另一个用于异步 图书馆用户应决定使用哪个版本 服务结果可能对于系统继续运行 同步调用 至关重要 可能需要在不同的工作线程中完成相同的操作 因为结果
  • C# - 当站点上没有活动时,Quartz 调度程序停止运行

    我用quartz调度器创建了asp net站点 该作业正在后台运行 站点上没有其他活动 Quartz 调度程序每 30 分钟调度一次 IIS启动后 Scheduler运行正常 但一段时间后 Scheduler 停止运行 大约 1 小时 如果
  • 欢迎消息在网络聊天中不可见,但可以在模拟器中使用

    IConversationUpdateActivity update message using var scope Microsoft Bot Builder Dialogs Internals DialogModule BeginLif
  • 创建新视图时如何初始化视图模型中的属性?

    我有一个应用程序 可以打开一个视图 允许您搜索数据 然而 为了进行搜索 用户必须选择他想要在什么类别下进行搜索 目前 我正在尝试弄清楚如何将所选类别从主视图模型 作为 int 传递到新搜索视图的视图模型 目前我正在尝试在主视图中使用类似的东
  • 如何保存具有多个缩进设置的XmlDocument?

    我需要保存一个XmlDocument以适当的缩进归档 Formatting Indented 但有些节点及其子节点必须排在一行 Formatting None 从那时起如何实现这一目标XmlTextWriter接受整个文档的设置 在 Ahm
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • 重复取消引用多个指针,效率较低?

    而不是写 string name first gt next gt next gt next gt name int age first gt next gt next gt next gt age 将其写为 node billy bloc
  • 如何取消 NetworkStream.ReadAsync 而不关闭流

    我正在尝试使用 NetworkStream ReadAsync 读取数据 但我找不到如何取消调用后的 ReadAsync 作为背景 NetworkStream 由连接的 BluetoothClient 对象 来自 32Feet NET 蓝牙
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • 制作 C# 项目 DLL 和 EXE

    我正在开发一个项目 需要有一个可执行文件以便用户可以运行配置界面和一个可以嵌入其他项目以使用其他一些功能的 DLL 有没有办法让 Visual Studio 同时生成可执行文件和 DLL 而不是每次都手动切换 我同意 TJMonk15 的观
  • 即使使用前向声明也会出现未定义的类型错误

    我正在阅读循环引用和前向声明 我确实知道在头文件中实现并不是一个好的设计实践 然而我正在尝试并且无法理解这种行为 使用以下代码 包含前向声明 我期望它能够构建 但是我收到此错误 Error 1 error C2027 use of unde
  • List.Except 不起作用

    我尝试减去 2 个列表 如下代码所示 assignUsers已获得 3 条记录assignedUsers有 2 行 后Except方法我仍然得到 3 行 尽管我应该得到 1 条记录 因为 2 行assignedUsers类似于assignU
  • 我试图使这段代码递归,但由于某种原因它不起作用[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图使这
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在

随机推荐

  • asyncio:睡眠亚毫秒间隔

    我正在构建一个基于树莓派的设备 它将具有多个应同时工作的并发功能 在这种情况下 使用 asyncio 看起来是一个合理的选择 好吧 我可以用线程用 C 编写所有这些东西 但 python 代码看起来更紧凑 其中一项功能是通过 GPIO 脉冲
  • 使用 VirtualAllocEX 时出现错误代码 487 (ERROR_INVALID_ADDRESS)

    我正在尝试使用 VirtualAllocEx 当我设置dwSize 第三个参数 为大于约 63 MB 的数字 当我查看时会导致生成错误代码 487GetLastError 但是 它适用于较小的大小 例如 4MB 这是我的代码的一部分 Vir
  • 处理传递给 WCF 服务的无效 URI

    我有 WebGet 和 WebInvoke 属性来描述我的合约 但是处理无效 URI 的最佳方法是什么 现在 如果用户传递的 URI 与我当前的操作不匹配 他们会收到 未找到端点 的消息 信息 我想传回更具描述性的消息 例如 我的 URI
  • Android 动态功能:错误 -2 模块不可用

    我一整天都在调试 没有任何结果 我遵循了每个文档和谷歌代码实验室 并将捆绑包上传到内部测试 但错误仍然存 在 模块不可用 下面是我的实现 Module AndroidManifest xml
  • GAE 向所有活动实例发送请求

    有没有办法将请求发送到 Google App Engine 中模块 服务的所有活动实例 如果我可以获得所有活动实例 ID 的列表 我可以发出如下请求https instance dot version dot service dot app
  • 如何将本地 json 加载到 List 变量中?

    如何将本地 json 加载到 List 变量中 这是我本地的 json id 00 name TRL id 01 name USD id 02 name GBP id 03 name EUR 然而这有效 List
  • 用于代码分析的 Java 库

    有没有任何 Java 库可以帮助构建AST http en wikipedia org wiki Abstract syntax tree来自指定的 java 源文件 反之亦然 从 ASTree 对象生成代码 我需要类似的东西this ht
  • Gradle 多个版本的 GRADLE

    为了清楚起见 这不是关于依赖项的多个版本 而是关于 Gradle 自己的 jar 的多个版本 我想this https stackoverflow com questions 28339270 gradle retains multiple
  • 即使从 BIOS 设置启用虚拟化后,也无法在 Windows 10 Home 上运行 Docker Toolbox

    在运行 docker faststart 终端时出现以下错误 运行预创建检查 预创建检查出错 这 计算机未启用 VT X AMD v 在 BIOS 中启用它是 强制 看起来步骤 检查是否 出了问题 机器默认存在 按任意键继续 我已经尝试了从
  • 有没有办法让flymake只在保存时才编译

    当我输入 Flymake 时 光标会稍微悬起 这有点烦人 我想知道是否有一种方法可以告诉 Flymake 在每次更改某些内容时不要解析和编译 只需在保存时执行即可 还有其他建议吗 Thanks 您可以覆盖flymake after chan
  • 退出vim后保持编辑文件的视图

    当我退出 vim 时 显示内容将恢复为我进入之前所看到的内容 在非 vim vi 上 除了底线之外 您可以保持 vi 屏幕完整 vim 中是否有一个选项允许后一种行为 Vim 使用一个称为备用屏幕在那里编写它的 UI 并在退出时恢复原始 s
  • 在 Swift 中获取 PHAsset 的位置

    由于某种原因location财产在PHAsset仅在 Objective c 中公开 在 Swift 中不公开 文档 PHAsset location https developer apple com library prerelease
  • React Props 未定义

    我无法理解为什么我的 props updateBuilding 不起作用 当 prop 位于 render 方法中时 以下内容有效 class Buildings extends Component constructor props su
  • Apache 不使用 mod_rewrite.c

    所以我只是用 debian apache 等设置了一个 linode 服务器 现在我试图让我正在开发的应用程序运行 但它需要mod rewrite c 因此 很自然地 我转到应用程序的目录 如果重要的话 可能是 PHP 目录 并创建了一个
  • Ember CLI 在生产中失败

    我正在通过 jenkins 部署 Ember CLI 应用程序并使用 nginx 发布它 这是詹金斯构建脚本 npm install bower install node modules ember cli bin ember build
  • preg_replace + UTF-8 在一台服务器上不起作用,但在另一台服务器上起作用

    echo preg match b b iu 由于某种原因 此代码在我测试过的几台服务器上返回 1 但在一台特定服务器上返回 0 PCRE 编译时支持 UTF 8 和 Unicode 属性 可能是什么问题 PHP 使用的 PCRE 版本之间
  • 动画 CALayer 隐藏

    我试图隐藏一个CALayer几微秒后我正在使用CABasicAnimation为隐藏设置动画 目前我正在尝试使用 aLayer setHidden YES CABasicAnimation hideAnimation CABasicAnim
  • Jython :: PythonInterpreter 可以使用哪些模块以及如何添加更多模块

    我正在使用Jython 2 5 3 PythonInterpreter类来评估一些简单的脚本 但是当我需要导入任何非核心模块时 我会得到一个异常 我必须在 CLASSPATH 中添加一些 jython 库 jar 吗 缩小演示问题的代码范围
  • R 2.14 字节编译 - 无法使用 install.packages 进行?

    看来 R 2 14 可以使用开关来字节编译包R CMD INSTALL但我在 install packages 文档中找不到这样的选项 我错过了什么吗 正如它所说 install packages 您可以使用INSTALL opts 将附加
  • 无法捕获 lambda 中的静态变量[重复]

    这个问题在这里已经有答案了 这看起来很奇怪 我可以捕获静态变量 但前提是该变量未在捕获列表中指定 即它隐式捕获它 int main int captureMe 0 static int captureMe static 0 auto lam