重新檢視未定義的行為和序列點
當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中文網其他相關文章!