首頁 > 後端開發 > C++ > 如果 std::move 實際上沒有移動任何東西,為什麼它被稱為 std::move ?

如果 std::move 實際上沒有移動任何東西,為什麼它被稱為 std::move ?

DDD
發布: 2024-11-14 19:09:02
原創
589 人瀏覽過

Why is std::move called std::move if it doesn't actually move anything?

為什麼 std::move 命名為 std::move?

儘管有它的名字,std::move(x) 在物理上並不移動任何東西。相反,它只是轉換為右值,具體稱為 xvalue。這個術語與純右值形成對比,純右值指的是已知固定值的表達式。

使用 std::move 命名約定的目的不是為了誤導,而是為了增強程式碼可讀性。

最初,將左值轉換為右邊值需要使用不熟悉的 static_cast(a) 語法。此程式碼片段示範如何使用此方法交換兩個值:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板