2016-11-11 91 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聲明器是可選的(這就是爲什麼你可以省略括號)。