首頁  >  文章  >  後端開發  >  您可以指派給類別類型的右值參考嗎? 一個悖論的解釋。

您可以指派給類別類型的右值參考嗎? 一個悖論的解釋。

Susan Sarandon
Susan Sarandon原創
2024-11-01 17:44:02359瀏覽

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

分配給類別類型的右值引用:已解決的悖論

在C 領域,左值和右值之間的區別至關重要。左值表示具有可以修改的記憶體位置的對象,而右值則表示不能修改的臨時對像或常數。然而,一個有趣的程式碼片段引發了關於這個基本分歧的問題:

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

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}</code>

為什麼這段程式碼可以編譯?建構函數傳回的右邊值不是短暫的,因此不適合賦值嗎?

理解這個悖論的關鍵在於 C 中的隱式賦值運算子。當沒有為類別明確定義賦值運算子時,編譯器會合成預設賦值運算子。至關重要的是,這個合成運算子在某些情況下可以適用於右邊值。

這就是顯式關鍵字發揮作用的地方。在給定的範例中,Y 類別沒有聲明賦值運算符,因此編譯器會產生一個。顯式關鍵字可以防止右邊值的隱式轉換,但不會阻止合成賦值運算子應用於右邊值。

因此,在我們的程式碼中,合成賦值運算子:

<code class="cpp">Y& Y::operator=(Y const&);</code>

<code class="cpp">Y& Y::operator=(Y&);</code>

可以用左邊的右邊值Y(1)來調用。即使 Y(1) 是右邊值,這也允許賦值繼續進行。

為了防止對臨時物件進行賦值,可以使用引用限定符(&) 明確聲明賦值運算子:

<code class="cpp">class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};</code>

在這種情況下,賦值運算子將不會被合成,並且嘗試分配給右值將導致編譯錯誤。

以上是您可以指派給類別類型的右值參考嗎? 一個悖論的解釋。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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