首頁 >後端開發 >C++ >C 中的重載運算子是否可以消除「i = i」等表達式中的未定義行為?

C 中的重載運算子是否可以消除「i = i」等表達式中的未定義行為?

Barbara Streisand
Barbara Streisand原創
2024-12-04 00:22:09660瀏覽

Does Overloading Operators in C   Eliminate Undefined Behavior in Expressions like `i  =   i`?

重新審視未定義的行為和序列點

在主題「未定義的行為和序列點」的續集中,我們深入研究了涉及使用者定義類型的表達式。

使用者定義類型和未定義的行為

考慮以下涉及使用者定義類型索引的表達式:

i += ++i;

此具有內建類型索引的表達式:

此具有內建類型索引的表達式:
i.operator+=(i.operator++());

此具有內建的表達式的行為未定義。但是,如果 i 是 Index 類型,它是否仍然會呼叫未定義的行為?

不,它不會。這是因為表達式等效於:
i.operator+=(i.operator++());

由於重載運算子是函數,因此應用正常的排序規則。 i.operator() 求值後存在序列點,因此後續 i.operator =() 中對 i 的修改不會違反任何未定義的行為規則。
(i.operator++()).operator++()).operator++();

同樣,表達式 i.add(i .inc());和 i 定義明確。第一個表達式相當於:

第二個表達式相當於:

這些表達式中的每一個在運算子() 表達式求值之後都有一個序列點,確保物件i 在連續的序列點之間不會被修改兩次。

a[++i] = i;

下標運算子重載

表達式:

    其中a是重載下標運算子的使用者定義型,也是明確指出定義的。增量運算子傳回一個 Index 對象,然後用它來索引 a 數組。賦值運算子=相當於operator[]()方法,它是一個函數呼叫。因此,排序規則適用,並且在評估 i 後存在序列點。因此,表達式是明確定義的。
  • 附加點
與表達式關聯的序列點的數量確實取決於所涉及的操作數的類型,正如i = i 的情況所示。 在 C 03 中,表達式 i 是定義明確。

以上是C 中的重載運算子是否可以消除「i = i」等表達式中的未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn