为什么[] mutable {}无法编译?

时间:2016-11-11 14:08:45

标签: c++ c++11 lambda mutable

编译:

[]{};

这也是:

[]() mutable {};

但是使用这段代码,编译器会向我抛出错误消息:

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

有什么特别的原因吗?

2 个答案:

答案 0 :(得分:5)

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

lambda表达式以lambda介绍者(括号)开头,后跟可选的lambda声明符。

lambda声明符包含参数列表,mutable,attributes,exception specifier和return type。除参数列表外,所有这些都是可选的。因此,如果存在lambda声明符,则括号必须在那里。

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

答案 1 :(得分:1)

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