int main()
{
auto l = [x = 10]() -> decltype(x) {};
} 这是一个bug还是标准中有什么东西显式地阻止使用C++14通用语法捕获的对象在lambda的尾部返回类型中使用?
请注意,这两个编译器都对非广义捕获很满意:
int main()
{
int x = 10;
auto l = [x]() -> decltype(x) { return 0; };
} 发布于 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。
https://stackoverflow.com/questions/41162200
复制相似问题