了解 C++0x lambda 捕获

2024-04-30

在最近的一份 C++0x 草案 (n3225.pdf) 中,我们可以找到 5.1.2/10:

使用非限定名称查找的常用规则来查找捕获列表中的标识符(3.4.1);每个此类查找都应找到在本地 lambda 表达式的到达范围中声明的具有自动存储持续时间的变量。如果一个实体(即变量或 this)出现在 lambda 表达式的捕获列表中,则称该实体已被显式捕获。

That seems对我来说相当限制。例如,它seems对我来说,以下事情是不允许的:

int global;

struct s {
    int x;
    void memfun() {
        [x,global]{};
    }
};

since x不一定是自动存储的变量,也不是global。请注意,此捕获子句的目的是让 lambda 对象存储一个copy of x and global如果它们在稍后阶段发生变化,这可能是可取的。我已经知道一个替代方案:

int global;

struct s {
    int x;
    void memfun() {
        int copyx = x;
        int copyglobal = global;
        [copyx,copyglobal]{};
    }
};

但这归结为额外的副本和额外的样板只是为了捕获x and global作为副本。

另外,我在最新的草案中找不到任何关于如果我们在捕获子句中命名本地引用会发生什么的结论:

int main() {
    int  i = 0;
    int &r = i;
    assert([r]{return &r;}() != &i);
}

lambda 对象是“复制引用”还是“复制 int”?如果它通过副本捕获引用的对象,这可以为我们节省之前解决方法中的额外副本。

GCC 显然支持所有这些示例,并在最后一种情况下存储 int 的副本(恕我直言,这是可取的)。但我想知道这实际上是否是 C++0x 草案的预期行为,或者只是编译器扩展或实现错误。

Edit:

templatetypedef 指出 5.1.2/14 解释了当在捕获子句中命名引用时会发生什么。据我所知,这允许我们对第一个示例使用以下解决方法:

int global;

struct s {
    int x;
    void memfun() {
        auto& cx = x;
        auto& cglob = global;
        [cx,cglob]{};
    }
};

蒂亚, 塞利比策


从您发布的内容来看,您的第一个示例似乎是非法的,因为捕获的变量都没有自动持续时间。 但是,您可以轻松解决此问题。要捕获数据成员,只需捕获它即可,而全局不需要捕获,直接引用即可。

EDIT:正如您所指出的,这不会创建您想要捕获的值的本地副本。 要在创建副本时捕获这些变量,您可以捕获它,然后在 lambda 内部显式创建数据成员的本地副本。

至于关于捕获引用的第二个问题,§5.1.2/14 说通过复制捕获引用类型的变量将创建引用值的副本,而不是创建引用的副本。因此,lambda 将拥有其自己的引用创建时所引用的值的副本。

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

了解 C++0x lambda 捕获 的相关文章

随机推荐

  • MouseAdapter:它使用哪种模式?

    我已经找到了很好的资源 这些资源告诉我 Java API 中的 MouseAdapter 没有使用适配器模式 问题是 MouseAdapter 是否实现了某种模式 我知道它的作用 它为 MouseListener 接口创建了一个具体的类 因
  • 如何设置上一个/下一个箭头按钮的样式?

    GOAL 我一直在尝试修改slick css以适应我的网站所需的风格 我拿到slick css from here http kenwheeler github io slick Now 我想让箭头 左 右 更大 对于图标 我想使用没有的图
  • 如何使用oembed标签实现丰富的pins

    我需要实现 pinterest 提供的丰富的引脚 http developers pinterest com rich pins http developers pinterest com rich pins 推荐的方法之一是使用 oemb
  • TFS Pending Changes 能否像 SourceGear Vault 一样显示真正更改的文件?

    我一直在使用 SourceGearVault 进行一些个人项目 并使用 Team Foundation Server 进行工作项目 TFS 缺少的一件事是 Vault 在其签入对话框窗口中具有的一项简单功能 在 Vault 客户端中 您可以
  • 组织 GUI 代码

    我的问题有两个部分 有没有人对网络上的一些文档有任何关于如何编写易于阅读 编写和维护的 GUI 代码的提示或参考 Example 我发现我的 GUI 表单变得越广泛 我最终会得到一长串相当短的事件处理程序方法 如果我尝试添加任何私有辅助方法
  • java中带有二维键的映射

    我想要一个在 Java 中由两个键索引的映射 在其中使用两个键放置和检索值的映射 需要明确的是 我正在寻找以下行为 map put key1 key2 value map get key1 key2 returns value map ge
  • 阅读器关闭时调用元数据的尝试无效?

    我正在数据读取器上运行 if else 语句来查询表数据并激活 取消激活页面上的某些控件 我实现了一个 using 语句来在关闭块时自动关闭连接和阅读器 但我仍然在每个 if else 语句上收到阅读器已关闭错误 少了什么东西 代码如下 s
  • 如何更改每种语言的 vim 设置?

    我将 vim 与许多不同的语言 C C Java shell 等 一起使用 我知道 vim 已经为每种语言预设了设置 但我想根据我个人的喜好更改每种语言的设置 我已经有一个带有设置的 vimrc 文件 但我想要更多文件来根据我使用的语言声明
  • Dropzone 的“勾号”标记没有显示?

    I have been using dropzone to upload the image file on my localhost Everything is working fine file is being uploaded an
  • 当新版本的 pod 可用时,“pod update”会覆盖我的代码更改吗?

    我已使用 cocoapods 将 MKStoreKit 版本 4 99 添加到我的项目中 我的 Podfile 包含 platform ios 6 0 pod MKStoreKit gt 4 99 MKStoreKit 有一个名为 MKSt
  • 当我运行 C# 参数化查询时,它超时。具有硬编码参数的相同查询工作正常

    我想获取文本列包含字符串过滤器的所有 ID 当我运行此参数化查询时 它超时 SqlCommand cmd new SqlCommand SELECT ID FROM TableName WHERE Text LIKE filter conn
  • 下面的代码是如何工作的?

    众所周知 cout 在 VS2010 中是无缓冲的 参见 Stephan Lavavej 的帖子 here http connect microsoft com VisualStudio feedback details 642876 st
  • 是否可以将 RSA Archer 与多个 Active Directory 集成?

    是否可以将 RSA Archer 与多个 Active Directory 集成 一切皆有可能 只是你愿意付出多少努力 Option 1 推荐 RSA Archer v5 x 支持多种 LDAP 同步配置 因此 您可以拥有多个 AD 服务器
  • 使用 python 登录 Instagram 时出错

    我正在尝试使用 argparse 通过 python 脚本登录我的 Instagram 似乎已连接 但打印出 无法加载该页面 如果您的浏览器禁用了 cookie 或者您正在以私人模式浏览 请尝试启用 cookie 或关闭私人模式 然后重试您
  • 有没有办法让特定的 div 忽略它的父 div 的位置?

    我有一个 div 其位置因其包含的 div 的相对定位而偏离 虽然删除父级的相对定位可以解决问题 但我们宁愿不将其作为解决方案来实现 因为它可能会破坏其他内容 有没有办法强迫孩子忽略父母的定位 不幸的是 没有办法让一个元素通过 CSS 动态
  • 合并来自 ffmpeg 的两个视频

    我想使用 ffmpeg 将两个 mp4 视频组合成一个 mp4 视频 到目前为止我尝试过的是 ffmpeg i input1 mp4 i input2 mp4 output mp4 但是 每次我获取带有第一个输入的视频编解码器的视频而不是另
  • iPhone X - 设置主页指示器周围区域的颜色

    当我尝试将工作表与 iPhone X 的安全区域对齐时 我对 Xcode 还很陌生 它在工作表下方留下了一个透明区域 有没有办法设置该区域的填充而不扩展纸张或在安全区域之外对齐 这是我的小扩展 如果有人可以建议改进以不通过 幻数 标签访问添
  • 如何找到与一个变量中的最大值相对应的所有变量的最大值?

    我有一个包含许多变量的每日数据 xarray 我想提取最大q routed每年及最大当日其他变量的对应值q routed发生
  • 什么是 NullPointerException,如何修复它?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 什么是空指针异常 java lang NullPointerException 以及是什
  • 了解 C++0x lambda 捕获

    在最近的一份 C 0x 草案 n3225 pdf 中 我们可以找到 5 1 2 10 使用非限定名称查找的常用规则来查找捕获列表中的标识符 3 4 1 每个此类查找都应找到在本地 lambda 表达式的到达范围中声明的具有自动存储持续时间的