[英]c++17 evaluation order with operator overloading functions
關於這個問題
有了這個規范
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.