為什麼 std::move 命名為 std::move?
儘管有它的名字,std::move(x) 在物理上並不移動任何東西。相反,它只是轉換為右值,具體稱為 xvalue。這個術語與純右值形成對比,純右值指的是已知固定值的表達式。
使用 std::move 命名約定的目的不是為了誤導,而是為了增強程式碼可讀性。
最初,將左值轉換為右邊值需要使用不熟悉的 static_cast
template <class T> void swap(T& a, T& b) { T tmp(static_cast<T&&>(a)); a = static_cast<T&&>(b); b = static_cast<T&&>(tmp); }
透過用std::move 取代static_cast,程式碼變得更加直觀並傳達了函數的意圖,即移動值而不是複製它們:
template <class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); }
使用std::move 可以讓程式設計師清楚地看到值正在被移動,即使他們可能不完全理解複雜的細節右值和移動語義。
此外,如果程式設計師願意,可以自由定義自己的函數或巨集來將值轉換為右值。例如,以下程式碼片段使用名稱set_value_category_to_xvalue 實現了std::move 的功能:
template <class T> inline constexpr auto& set_value_category_to_xvalue(T&& t) noexcept { return static_cast<std::remove_reference_t<T>&>(t); }
最終,雖然std::move 產生的目標程式碼不涉及任何實際移動,但它會播放在編譯過程中扮演重要角色。它改變了呼叫哪個函數的重載,可能導致呼叫類別中定義的更有效的移動賦值運算子。
以上是如果 std::move 實際上沒有移動任何東西,為什麼它被稱為 std::move ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!