首頁  >  文章  >  後端開發  >  右值賦值:禁止還是功能?為什麼我們可以分配一個回傳值?

右值賦值:禁止還是功能?為什麼我們可以分配一個回傳值?

Patricia Arquette
Patricia Arquette原創
2024-10-31 09:19:30388瀏覽

 Assignment to Rvalues: Forbidden or Feature? Why Can We Assign to a Return Value?

對右邊值賦值:為什麼以及如何?

為什麼可以將類別類型的回傳值(右值)賦值?按照慣例,右值被認為是短暫的,缺少記憶體位址。那麼,它們如何用作左手值(左值)呢?

考慮以下令人費解的程式碼:

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

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}

這段程式碼編譯時沒有錯誤,儘管它可能看起來不合邏輯。要理解其中的原因,我們需要深入研究賦值運算子背後的機制。

綜合賦值運算子

當類別沒有明確定義賦值運算子時,編譯器會自動產生一個。合成運算子可以採用以下兩種形式之一:

  • Y& 運算子=(Y const&)
  • Y& 運算子=(Y&)()

後一種形式值得注意,因為它適用於右值。因此,在上面的範例中,編譯器產生一個賦值運算符,它可以接受建構函數 Y(1) 傳回的右邊值。

防止對右邊值賦值

If如果您希望禁止將右邊值賦值,可以使用引用限定符明確聲明賦值運算子。透過這種方式,您可以限制運算子僅接受左值。例如:

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

透過使用引用限定符 &,可以確保合成的賦值運算子僅適用於左值。

以上是右值賦值:禁止還是功能?為什麼我們可以分配一個回傳值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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