首頁 > 後端開發 > C++ > 重載運算子是否可以消除具有使用者定義類型的表達式(如'i = i”)中的未定義行為?

重載運算子是否可以消除具有使用者定義類型的表達式(如'i = i”)中的未定義行為?

DDD
發布: 2024-12-22 19:27:13
原創
889 人瀏覽過

Does Overloading Operators Eliminate Undefined Behavior in Expressions like `i  =   i` with User-Defined Types?

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

當i 是內建型別時,表達式i = i 已標示為呼叫未定義的行為。但是,當 i 是使用者定義類型時,它會引發有關類似表達式的行為的問題。

使用者定義型別注意事項

型Index 定義為:

class Index {
    int state;

    public:
        Index(int s) : state(s) {}
        Index& operator++() {
            state++;
            return *this;
        }
        Index& operator+=(const Index &index) {
            state += index.state;
            return *this;
        }
        operator int() {
            return state;
        }
        Index& add(const Index &index) {
            state += index.state;
            return *this;
        }
        Index& inc() {
            state++;
            return *this;
        }
};
登入後複製

像i.operator =(i.operator ());這樣的表達式或i.add(i.inc());仍然呼叫未定義的行為?

序列點意義

表達式i.operator =(i.operator ());不會呼叫未定義的行為,因為:

  • 重載運算子是函數,它們在求值之前和之後都有序列點。
  • 運算子 () 和運算子 =() 呼叫因此具有良好的效能-定義的序列點。
  • 因此,表達式的行為符合預期,不會違反序列點

非表達式註意事項

原始表達式= i 提出了它是否是表達式的問題。如果不是,則可能不受序列點規則的約束。然而,這個論點不太可能成立,因為它被解析並作為表達式執行。

多重修改

另一個感興趣的表達式,a[ i] = i ,由於序列點之間的潛在修改也引發了問題。然而,當 a 是重載下標運算子的使用者定義類型時,它是明確定義的。

表達式複雜度

表達式 i 在 C 中是明確定義的03因為它等價於((i.operator()).operator()).operator(),它在函數之間有明確定義的序列點

結論

涉及使用者定義類型和序列點的表達式的行為取決於運算符的具體實作。重載運算子表現為函數,提供序列點。然而,一個表達式是否受序列點規則的約束可能取決於它的語法結構和作為表達式的解釋。

以上是重載運算子是否可以消除具有使用者定義類型的表達式(如'i = i”)中的未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板