访问C 14 lambda捕获诸如结构成员之类的捕获
Access C++14 lambda captures like struct members
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 [...]是否未指定其他未命名的非静态数据成员 以参考捕获的实体的关闭类型声明。
捕获的变量未命名(或至少有名称 凡人无法表达的)及其声明令是故意的 未指定。引用捕获可能甚至都不存在 类型。
大胆的重点。
- 如何在C++中定义静态成员结构
- 使用模板化类的成员结构
- 初始化固定的 C 数组成员结构
- 指向成员结构的指针如何工作
- 如何将此“指针从外部类传递到成员结构
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化
- 映射文件中成员结构的地址
- Visual C++ 模板类成员结构初始化语法糖
- C :初始化成员结构的静态字段的正确方法
- 如何在C 类的初始化器列表中使用未命名结构初始化成员结构
- 从成员结构的成员函数中访问类的成员?
- 模板化类的成员函数无法返回指向成员结构的指针?
- 重载非类型模板结构的成员结构的复制赋值运算符
- 灵气属性传播问题与单成员结构.
- 将具有 int* 成员C++结构编接到 C#
- 复杂的班级成员结构
- 将向量成员(结构)传递给函数
- 成员结构的前向声明
- 重载运算符<<用于模板结构中定义的成员结构
- 返回带有模板化类的类成员结构