為什麼類別類型的右邊值可以賦值?
在 C 中,通常無法將右邊值運算式賦值。然而,下面的程式碼片段似乎違反了這種行為:
class Y { public : explicit Y(std::size_t num = 0) {} }; int main() { Y(1) = Y(0); // Assignment to rvalue return 0; }
解釋:
與最初的預期相反,此程式碼編譯成功。原因在於成員函數的隱式綜合,特別是賦值運算子。根據 C 標準(第 12.8 節 [class.copy],第 18 段),如果未宣告賦值運算子或將其標記為已刪除,則編譯器會合成一個賦值運算子。對於類別類型Y,合成賦值運算子將具有以下簽章:
請注意,這些簽章在參數之前不包含參考限定符(&)。因此,合成賦值運算子適用於右邊值表達式。
此行為允許對透過呼叫建構函式所建立的臨時物件進行賦值:Y(1)。
防止 Left -Hand Side Temporary:
為了防止在賦值的左側建立臨時對象,您可以使用稱為「複製省略」的技術。這涉及使用引用限定符聲明賦值運算符,如以下修改後的程式碼所示:
class Y { public : explicit Y(std::size_t num = 0); Y& operator= (Y const&) & = default; };
透過此更改,合成賦值運算子將不再適用於右值。
以上是為什麼我們可以為 C 中的類別類型的右值賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!