分配給類別類型的右值引用:已解決的悖論
在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中文網其他相關文章!