簡體   English   中英

帶有運算符重載函數的c ++ 17評估順序

[英]c++17 evaluation order with operator overloading functions

關於這個問題

C ++ 17引入了哪些評估順序保證?

有了這個規范

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

而這篇文章來自規范

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

這是否意味着這兩個表達式不再相同?

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

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

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

確實。 [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的值是1還是2

- 結束例子]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM