簡體   English   中英

C++:自定義逗號運算符的求值順序是什么?

[英]C++: What is the evaluation order of the user-defined comma operator?

我正在閱讀 Nicolai Josuttis 的“C++ 17 Completed Guide”並遇到以下表達式:

foo(arg1), (foo(arg2), foo(arg3));

作者聲稱內置逗號運算符的評估順序將從左到右,但可以通過重載它們來更改。 但是,我在 cppreference ( https://en.cppreference.com/w/cpp/language/eval_order ) 上看到了“評估順序”文章,並遇到了以下陳述:

  1. 內置逗號運算符的第一個(左)參數的每個值計算和副作用,在第二個(右)參數的每個值計算和副作用之前排序。

  1. 每個重載的運算符都遵循內置運算符的排序規則,當使用運算符表示法調用時,它會重載。

因此,根據聲明 16,cppreference 似乎聲稱重載的逗號運算符具有與其內置對應項相同的評估順序。 那么,作者所說的“通過重載逗號運算符,您可以更改其評估順序”究竟是什么意思,以及預期的具體行為是什么?

C++17 之前的評估順序一團糟。 C++17 對評估順序進行了徹底的更改,這很可能只是作者的一個錯誤。

在 C++17 之前,重載運算符是完整的語法糖。 對於任何二元運算符@a@b等價於以下之一

operator@(a, b)
a.operator@(b)

取決於它是會員 function 還是免費 function。 也就是說, ab相對於彼此是無序的

在 C++17 中, a@b的評估順序與內置操作符相同 對於逗號運算符, ab之前排序。 在 function 調用版本中, ab是不定序的。

暫無
暫無

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

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