首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问lambda尾随返回类型中捕获的泛化对象

访问lambda尾随返回类型中捕获的泛化对象
EN

Stack Overflow用户
提问于 2016-12-15 10:45:14
回答 1查看 283关注 0票数 12
代码语言:javascript
复制
int main()
{
    auto l = [x = 10]() -> decltype(x) {};
}   
  • rejects this code有以下错误: 错误:使用未声明的标识符'x‘自动l= x = 10 ->解密类型(X) {};^
  • rejects this code有以下错误: 函数'int ():error:'x‘在此作用域中未声明-- auto l= x = 10 -> decltype(x) {};^ error:'x’在此作用域中没有在lambda函数中声明:警告:函数中没有返回语句,返回非无效-W返回类型的auto l= x = 10 -> decltype(x) };^

这是一个bug还是标准中有什么东西显式地阻止使用C++14通用语法捕获的对象在lambda的尾部返回类型中使用?

请注意,这两个编译器都对非广义捕获很满意:

代码语言:javascript
复制
int main()
{
    int x = 10;
    auto l = [x]() -> decltype(x) { return 0; };
}   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-15 11:24:07

TL;DR:编译器的行为与预期一致。

标准定义lambda语义如下,expr.prim.lambda,第1节

lambda-表达: lambda-介绍人lambda-声明器_opt复合-语句

这里,复合语句只是{}之间的lambda的主体,因为其他所有内容都包含在lambda声明器中。

lambda-声明器: (参数-声明-子句)decl-说明符-seq_opt异常-规范_opt属性-说明符-seq_opt尾部-返回类型_opt

另外,在同一章的第12节中,有人说

init捕获的行为就好像它声明并显式捕获了表单“自动init捕获”的一个变量;其声明区域是lambda表达式的复合语句,但是: (12.1) -如果捕获是通过复制(见下文),则为捕获和变量声明的非静态数据成员被视为引用同一对象的两种不同方式,该对象具有非静态数据成员的生存期,并且不执行额外的复制和销毁,并且 (12.2) -如果捕获是引用的,则变量的生存期将在闭包对象的生存期结束时结束。

因此,在第一个示例中,变量x作用域仅为lambda,不包括decltype表达式。在第二个示例中,显然,x作用域是函数main

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41162200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档