使用隱式移動規則按值傳回類別物件
當從函數以值傳回類別的物件時,隱式移動規則規則開始發揮作用。此規則決定使用哪個建構函式來初始化傳回的物件。通常,如果物件被視為 xvalue(可以從中移動的表達式),則首選移動建構子。
在 範例 1 中,我在 Some_thing() 中聲明的變數函數是 xvalue,因為它是在局部作用域中聲明的,並且被認為是符合移動條件的。因此,將呼叫移動建構子 test(test&& s),如輸出所示。
但是,在 範例 2 中,您刪除了移動建構函式並將複製建構函式修改為 test (測試&z)。此更改導致輸出顯示對複製建構函數 test(test& z) 的調用,而不是移動建構函數,這是由於隱式移動規則而預期的。
出現這種看似矛盾的行為是因為 i 仍被視為xvalue,但編譯器現在也認為「常規」複製建構子是可行的。隱式移動規則首先嘗試使用移動建構函數,但由於沒有移動建構函數,因此它繼續使用複製建構函數。
要明確強制使用移動建構函數,您可以刪除複製建構函數,如範例3所示。這可以防止編譯器將複製建構函式視為選項,即使將移動建構函式標記為 const(通常會阻止移動),也會使用移動建構函式。
範例 4 示範如果移動建構函式可用且移動操作為 noexcept,則仍可以移動 const 物件。在這種情況下,u 初始化期間創建的臨時物件被移動到 r,從而導致呼叫移動構造函數。
以上是當移動建構函式不可用時,為什麼隱式移動規則喜歡複製建構函式而不是移動建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!