如果我理解正确this answer和参考标准节[dcl.type.auto.deduct-5],代码:在decltype(auto)的情况下是否有lambda的特殊规则?
decltype(auto) a = e;
总是等同于
decltype(e ) a = e;
但现在的问题出现,如果不是的e
我把lambda表达式decltype(auto)
:
decltype(auto) lambda = [](){};
本编译,令我惊讶的是,在gcc和clang都成功。原因我已经经历了震荡中奠定了标准,具体说是拉姆达不应该在未计算的操作数[expr.prim.lambda#2](重点煤矿)发生:
一个lambda表达式是一个prvalue,其结果对象称为 闭包对象。 Lambda表达式不应出现在未评估的 操作数中,模板参数中,别名声明中,类型声明 声明中,或函数或函数模板 声明的函数体外部和默认值参数。
但正如我所提到的例子是等价于:
decltype([](){}) lambda = [](){};
书面明确显然上面的代码会形成不良。当然我们可以假设decltype
里面的语句[](){}
是一种参考,并不像structured bindings那样是一个参考,但是在标准中有一个特殊规则,我错过了包括lambda初始化decltype(auto)
?
好两种编译器团队独立理解像你这样有一个巨大的机会,你是对的。尽管如此,如果你说“它不完全等效”,那么不应该对如何解释它有严格的规定吗? –
我的意思是 - 它不应该像初始化列表的情况下行事 - 其中'自动x6a = {1,2};'是好的,但'decltype(auto)x6d = {1,2};'不是? –
@ W.F .:“*不应该有如何解释它的严格规定*”有一个严格的规则;他只是为你引用了它。这就是为什么“两个编译器团队”是对的。 –