如果我理解正確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 .:「*不應該有如何解釋它的嚴格規定*」有一個嚴格的規則;他只是爲你引用了它。這就是爲什麼「兩個編譯器團隊」是對的。 –