首頁 >後端開發 >C++ >為什麼我們可以為 C 中的類別類型的右值賦值?

為什麼我們可以為 C 中的類別類型的右值賦值?

Patricia Arquette
Patricia Arquette原創
2024-10-29 13:58:02947瀏覽

 Why Can We Assign to Rvalues of Class Type in C  ?

為什麼類別類型的右邊值可以賦值?

在 C 中,通常無法將右邊值運算式賦值。然而,下面的程式碼片段似乎違反了這種行為:

class Y {
public :
    explicit Y(std::size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // Assignment to rvalue
    return 0;
}

解釋:

與最初的預期相反,此程式碼編譯成功。原因在於成員函數的隱式綜合,特別是賦值運算子。根據 C 標準(第 12.8 節 [class.copy],第 18 段),如果未宣告賦值運算子或將其標記為已刪除,則編譯器會合成一個賦值運算子。對於類別類型Y,合成賦值運算子將具有以下簽章:

  • Y& Y::operator=(Y const&)
  • Y& Y::operator=(Y&)

請注意,這些簽章在參數之前不包含參考限定符(&)。因此,合成賦值運算子適用於右邊值表達式。

此行為允許對透過呼叫建構函式所建立的臨時物件進行賦值:Y(1)。

防止 Left -Hand Side Temporary:

為了防止在賦值的左側建立臨時對象,您可以使用稱為「複製省略」的技術。這涉及使用引用限定符聲明賦值運算符,如以下修改後的程式碼所示:

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator= (Y const&) & = default;
};

透過此更改,合成賦值運算子將不再適用於右值。

以上是為什麼我們可以為 C 中的類別類型的右值賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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