访问C 14 lambda捕获诸如结构成员之类的捕获

Access C++14 lambda captures like struct members

本文关键字:成员 结构 lambda 访问      更新时间:2023-10-16

afaik,C 11/14在定义lambda时不允许在现场定义新的返回类型。但是,似乎C 14 lambda捕获表达式基本上创建了一个或多个"成员"和一个操作员()的匿名类型。因此,为什么编译器不允许从 lambda的中访问捕获的成员。我微弱的头脑无法处理C 的复杂性,但听起来对您来说是一种合理的语言延伸吗?这是一个例子。

vector<string> words = { "Stack", "Overflow" };
auto l = [w = words](){}; // almost like a C# anonymous type
cout << l.w[0]; // does not work. 

状态

当lambda init-captures 添加到该语言时,讨论了这一点。标准的当前工作草案(N3797)说(在中[Expr.prim.lambda] P11 ):

对于每个 init-capture 识别符 Init-capture 的非静态数据成员在关闭类型中声明。

标准确实指定该成员的访问,使其尚不清楚这是否有效:

auto x = [n(0)] {};
int k = x.n; // ok?

Init-Captures 的这一规范问题导致了国家机构评论GB3对标准草案的评论,该标准草案由C 核心工作组作为核心问题1760。在讨论该问题时,核心工作组决定lambda的 init-captures 是封闭对象的可访问成员。

第1760期的解决方案(由CWG批准,但尚未得到全部委员会的批准),更改了规格,而是说:

an init-capture 的行为就像声明并明确捕获了 “auto init-capture ;”的变量,其声明区域为 lambda-embression 's '语句 [...]

这个新措辞清楚地表明, init-capture 不会添加闭合对象的命名成员,而是像其他任何lambda捕获一样的作用。

作为语言扩展

制作 init-captures 当然可以访问封闭类型的成员(我在clang中对 init-captures 的最初实现做到了这一点,在我实施解决方案之前第1760期)。这似乎也是一个有用的功能,但它也将允许违反 lambda-expressions 的封装,在常见情况下,不应该看到 init-captures 。/p>

如果我理解正确的话,您希望能够访问在lambda中捕获的变量。但是根据从lambda捕获的变量的最高答案?这是不可能的。

不可能设计

5.1.2 [expr.prim.lambda]

15 [...]对于通过副本捕获的每个实体,以封闭类型声明一个未命名的非静态数据成员。未指定这些成员的声明顺序。[...]

16 [...]是否未指定其他未命名的非静态数据成员 以参考捕获的实体的关闭类型声明。

捕获的变量未命名(或至少有名称 凡人无法表达的)及其声明令是故意的 未指定。引用捕获可能甚至都不存在 类型。

大胆的重点。