我正在閱讀 Nicolai Josuttis 的“C 17 Completed Guide”并遇到以下運算式:
foo(arg1), (foo(arg2), foo(arg3));
作者聲稱內置逗號運算子的評估順序將從左到右,但可以通過多載它們來更改。但是,我在 cppreference ( https://en.cppreference.com/w/cpp/language/eval_order )上看到了“評估順序”文章,并遇到了以下陳述:
- 內置逗號運算子的第一個(左)引數的每個值計算和副作用,在第二個(右)引數的每個值計算和副作用之前排序。
和
- 每個多載的運算子都遵循內置運算子的排序規則,當使用運算子表示法呼叫時,它會多載。
因此,根據宣告 16,cppreference 似乎聲稱多載的逗號運算子具有與其內置對應項相同的評估順序。那么,作者所說的“通過多載逗號運算子,您可以更改其評估順序”究竟是什么意思,以及預期的具體行為是什么?
uj5u.com熱心網友回復:
在 C 17 之前,評估順序是一團糟。C 17 對評估順序進行了徹底的更改,這很可能只是作者的一個錯誤。
在 C 17 之前,多載運算子是完整的語法糖。使用任何二元運算子@,a@b 都等價于以下之一
operator@(a, b)
a.operator@(b)
取決于它是成員函式還是自由函式。也就是說,a并且b相對于彼此是無序的
在 C 17 中, 的求值順序a@b 與內置運算子 相同。對于逗號運算子,a在 之前排序b。在函式呼叫版本中,a并且b是不定序的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419340.html
標籤:
上一篇:容器迭代器——它們應該嵌套嗎?
