【问题标题】:Can inline lambda initializer capture 'this' pointer?内联 lambda 初始化程序可以捕获“this”指针吗?
【发布时间】:2014-09-19 12:51:30
【问题描述】:

内联成员初始化lambda可以捕获和使用this指针吗?

struct A{
  int a = 42;
  int b = [this](){
    return this->a * 4;
  }();
};

它是有效的 C++11 代码(根据规范)还是只是 GCC 扩展?

如果有效,为什么我在引用成员a时必须使用this->

【问题讨论】:

  • 这类问题应该发布在 StackOverflow 上!欢迎! :)
  • 使用-pedantic 选项很容易检查
  • 它与 -pedantic 一起使用 GCC 4.7 和 clang 3.2

标签: c++ c++11 lambda


【解决方案1】:

它是有效的 c++11 代码吗?

没有。只有块范围内的 lambda 可以有捕获列表:

C++11 5.1.2/9 一个lambda-expression,其最小的封闭范围是一个块范围是一个local lambda 表达式;任何其他 lambda-expression 都不应在其 lambda-introducer 中有 capture-list

看来这是一个 GCC 扩展。 (如 cmets 中所述,这是一个 open issue,因此很可能有一天会成为标准。)

为什么在提及成员 a 时必须使用 this->

至少对于我正在使用的 GCC 版本,您不会:http://ideone.com/K857VC

【讨论】:

  • 我想 N3797 改写了一下:A lambda-expression whose smallest enclosing scope is a block scope (3.3.3) is a local lambda expression; any other lambda-expression shall not have a capture-default or simple-capture in its lambda-introducer.
  • @MarcoA.:谢谢,我只是想看看这是否在 C++14 中发生了变化。这不会改变答案;您仍然无法在非本地 lambda 中捕获 this(作为 简单捕获)。
  • OTOH,由于 NSDMI 本质上是构造函数的成员初始化列表的语法糖,因此可以说它实际上具有块作用域(或类似的东西)......
  • 这是CWG 1632
  • @T.C.:感谢您的链接。在这里捕获this 肯定是有意义的,即使当前标准不允许这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多