【发布时间】:2017-07-06 10:29:30
【问题描述】:
如果我理解正确this answer 并引用了标准部分[dcl.type.auto.deduct-5],代码:
decltype(auto) a = e;
总是等价于
decltype( e ) a = e;
但是现在问题出现了,如果我将 lambda 表达式而不是 e 放入 decltype(auto):
decltype(auto) lambda = [](){};
令我惊讶的是,这在gcc 和clang 中都成功编译了。我所经历的震惊的原因在于标准,它明确指出 lambda 不应该出现在未评估的操作数 [expr.prim.lambda#2](强调我的)中:
lambda 表达式是一个纯右值,其结果对象称为 闭包对象。 lambda 表达式不应出现在未计算的 操作数,在模板参数中,在别名声明中,在 typedef 中 声明,或在函数或函数模板的声明中 在其函数体和默认参数之外。
但正如我提到的,这个例子相当于:
decltype([](){}) lambda = [](){};
上面显式编写的代码显然格式不正确。当然,我们可以假设 decltype 中的声明 [](){} 是一种引用,而不是像 structured bindings 那样的真正引用,但也许标准中有一条特殊规则我错过了涵盖 lambda正在初始化decltype(auto)?
【问题讨论】:
标签: c++ lambda c++14 language-lawyer decltype