首頁 > 後端開發 > C++ > 您可以在 C 中指派給類別類型的右值嗎?

您可以在 C 中指派給類別類型的右值嗎?

DDD
發布: 2024-10-28 09:26:29
原創
744 人瀏覽過

 Can You Assign to an Rvalue of Class Type in C  ?

對類別類型右值的賦值

概述

在C 程式語言中,右邊值(右手值)通常無法作為左值(左側值)。但是,此規則也有例外,如下列程式碼所示:

<code class="cpp">class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}</code>
登入後複製

令人驚訝的是,即使建構函式 Y(1) 傳回的物件是右邊值,此程式碼也能成功編譯。本文探討了這種意外行為背後的原因。

對類別類型右值的賦值

理解為何此程式碼有效的關鍵在於合成成員函數的概念。對於沒有明確定義賦值運算子的類,編譯器會產生預設賦值運算子。這個預設運算子是一個成員函數,它將對同一類別的物件的參考作為其參數。

在上面的範例中,類別 Y 的賦值運算符合成如下:

<code class="cpp">Y& Y::operator=(const Y& other);</code>
登入後複製

值得注意的是,這個合成賦值運算子是一個非常量成員函數。這意味著它可以應用於左值(引用的物件)和右值(未引用的物件)。

建構子傳回值

當使用傳回右邊值的建構子建立物件時,編譯器會在記憶體中產生一個臨時物件。該臨時物件將在創建它的語句結束時自動銷毀。但是,在建構函數傳回類別類型的右值的情況下,合成賦值運算子可以延長臨時物件的生命週期。

賦值語法

賦值語句Y(1) = Y(0);是以下程式碼的語法糖:

<code class="cpp">Y(1).operator=(Y(0));</code>
登入後複製

如我們所確定的,類Y的合成賦值運算子operator= 是一個非常量成員函數,這表示它可以應用於右邊值。因此,編譯器可以將賦值語句解釋為建構函數 Y(1) 所建立的臨時物件的賦值。

結論

與通常預期的相反,可以賦值為C 中類別類型的右值,因為編譯器會為沒有明確定義的賦值運算子的類合成非常量賦值運算符。這些合成的賦值運算子延長了建構函式創建的臨時物件的生命週期,允許對右邊值進行賦值。

以上是您可以在 C 中指派給類別類型的右值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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