2016-11-11 90 views
7

这将编译:为什么[] mutable {}不能编译?

[]{}; 

这还有:

[]() mutable {}; 

但有了这个代码,编译器朝我扔的错误消息:

[] mutable {}; 
    ^~~~~~~ 
error: lambda requires '()' before 'mutable' 

有什么特别的原因?

+2

@BaummitAugen阅读和理解标准是由它自己的技能(尤其是如果英语不是你的第一语言),所以可以问这样的问题恕我直言。 – Slava

+0

@BaummitAugen我在想,如果有什么特别的原因,标准就是这样指定的。如果没有,那么是的,我希望这会改变,因为我现在偶然发现了这几次。 –

+0

@RalphTandetzky我想不出一个很好的理由,很可能是一个疏忽。写一个提案来改变它! – TartanLlama

回答

5

这只是语法写在标准中的一种结果。我不知道这是否是一个疏忽。

lambda表达式以lambda引入程序(括号)开头,后跟可选的lambda声明程序。

lambda声明符包含参数列表,可变属性,异常说明符和返回类型。除参数列表外,所有这些都是可选的。所以如果一个lambda声明符存在,括号必须在那里。

这就是为什么你不能只有mutable关键字。

1

查看章节5.1.2 [expr.prim.lambda]的n4296(这是C++ 14最终草案),这只是它脱离语法的方式。 mutable只允许在lambda声明符 - 其中包括括号。整个lambda声明器是可选的(这就是为什么你可以省略括号)。