2017-09-25 123 views
16

對於這個問題C++ 17評價順序與運算符重載功能

What are the evaluation order guarantees introduced by C++17?

隨着本說明書

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf

而且從說明書

此外,該文本,我們建議添加下列內容nal規則: 的順序涉及重載運算符的表達式的求值是 ,由與相應的內置運算符 關聯的順序確定,而不是函數調用的規則。

這是否意味着這兩個表達式不再等價?

a << b; 
operator<<(a, b); 

由於第二個看起來像函數調用,因此在參數中沒有保證評估順序?

+7

這是正確的,這兩種不同的語法有不同的語義現在。運算符語法有其獨特的語義,函數調用語法具有函數調用的(新!)語義。 –

+0

@KerrekSB這就是爲什麼這個建議: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0431r0.htm 被寫了,但我不相信它獲得了任何牽引力。 – ForeverLearning

+0

@ForeverLearning:這當然是一個激發心靈,思想和建議的主題! –

回答

18

「由於第二個看起來像函數調用,因此在參數中沒有保證的評估順序?」

確實。 [expr.call]/5包含一個示例具體地覆蓋覆蓋在你的問題的兩種情況之間的差異[重點礦山]:

後綴表達在 表達式列表和每個表達式中的任何默認參數之前測序。參數 參數的初始化,包括每個關聯值計算和端點效應相對於任何其他 參數都是不確定的。

...

注:如果運營商功能是使用運營商的符號調用,用於指定 參數評測測序內置 運營商;見 [over.match.oper]。 [實施例:

struct S { 
    S(int); 
}; 
int operator<<(S, int); 
int i, j; 
int x = S(i=1) << (i=2); 
int y = operator<<(S(j=1), j=2); 

執行初始化後,i值爲2(見 [expr.shift]),但它是未指定j值是否是 12

- 結束舉例]

+0

只需看看:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0431r0.htm 建議是DOA。 – ForeverLearning

+0

@ForeverLearning感謝相關鏈接,這很有趣。 – dfri