對右邊值賦值:為什麼以及如何?
為什麼可以將類別類型的回傳值(右值)賦值?按照慣例,右值被認為是短暫的,缺少記憶體位址。那麼,它們如何用作左手值(左值)呢?
考慮以下令人費解的程式碼:
class Y { public : explicit Y(size_t num = 0) {} }; int main() { Y(1) = Y(0); // WHAT?!? return 0; }
這段程式碼編譯時沒有錯誤,儘管它可能看起來不合邏輯。要理解其中的原因,我們需要深入研究賦值運算子背後的機制。
綜合賦值運算子
當類別沒有明確定義賦值運算子時,編譯器會自動產生一個。合成運算子可以採用以下兩種形式之一:
後一種形式值得注意,因為它適用於右值。因此,在上面的範例中,編譯器產生一個賦值運算符,它可以接受建構函數 Y(1) 傳回的右邊值。
防止對右邊值賦值
If如果您希望禁止將右邊值賦值,可以使用引用限定符明確聲明賦值運算子。透過這種方式,您可以限制運算子僅接受左值。例如:
class Y { public : explicit Y(std::size_t num = 0); Y& operator=(Y const&) & = default; };
透過使用引用限定符 &,可以確保合成的賦值運算子僅適用於左值。
以上是右值賦值:禁止還是功能?為什麼我們可以分配一個回傳值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!