2013-08-02 18 views
1

雖然我讀92頁的C++ 11個標準,在此期間,它說,這是ellegal供您使用的支撐,初始化列表在此5.1.2 $ case: auto x = [] {return {1,2}}; //錯誤:一個支撐,初始化列表不是表達式爲什麼一個支撐,初始化列表不是表達式?

,我發現這兩個話題,一個從標準和N3681提案等。

Page397 $ 14.8.2.5:一個初始化列表參數會導致參數被視爲非推斷上下文。 和$ 7.6.1.4:使用一個新的發明類型模板參數U或,更換汽車的出現,如果初始化是一個支撐,初始化列表(8.5.4),用的std :: initializer_list。

雖然N3691提議建議「更改一個大括號初始化自動不推演到一個初始化列表,並禁止括號初始化汽車的情況下,其中支撐初始化具有多個元素」,它說「返回一個支撐列表將無法正常工作,因爲它不是一個表達式」 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

但是,我沒能找到‘爲什麼一個支撐,初始化列表不是體現在哪裏?’這可能有這個話題的相同含義: Why can't we have automatically deduced return types? 但有一點差異,而他試圖理解爲什麼C++ commitee斷定這種語法是毫無價值的。所以這一定有一個特別的原因嗎?非常感謝。

回答

1

http://www.stroustrup.com/default-argument.pdf報價:

The reason that an initializer list isn’t an expression is simply that we decided (correctly, IMO) not to allow initializer lists on the left hand side of assignments, as operands of ++, etc. and further decided (again correctly, IMO) to enforce that through the grammar.

+0

不夠公平,但它不IMO回答這個問題。第一部分(「LHS不允許」)適用於和VAR(這是在語法中的表達式)的第二部分,並說基本上是「它不是一個表達式(在語法),因爲我們決定不讓它在語法中的表達式執行第一部分的手段」(可以其他方式強制執行)。 – greggo

相關問題