std::move 和 std::forward

關聯點

都是執行轉換(cast)的函數(函數模板),不產生任何可執行代碼。且都可以把實參轉換成右值。
std::move無條件將實參(const除外 )轉換成右值引用,std::forward 條件返回右值引用


_EXPORT_STD template <class _Ty>
_NODISCARD _MSVC_INTRINSIC constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept {return static_cast<remove_reference_t<_Ty>&&>(_Arg);
}

_EXPORT_STD template <class _Ty>
_NODISCARD _MSVC_INTRINSIC constexpr _Ty&& forward(remove_reference_t<_Ty>& _Arg) noexcept {return static_cast<_Ty&&>(_Arg);
}_EXPORT_STD template <class _Ty>
_NODISCARD _MSVC_INTRINSIC constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept {static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");return static_cast<_Ty&&>(_Arg);
}

_EXPORT_STD template <class _Ty>
struct remove_reference {using type                 = _Ty;using _Const_thru_ref_type = const _Ty;
};template <class _Ty>
struct remove_reference<_Ty&> {using type                 = _Ty;using _Const_thru_ref_type = const _Ty&;
};template <class _Ty>
struct remove_reference<_Ty&&> {using type                 = _Ty;using _Const_thru_ref_type = const _Ty&&;
};_EXPORT_STD template <class _Ty>
using remove_reference_t = typename remove_reference<_Ty>::type;

先去引用,然后轉換成右值

區別

1. 用途不同

  • std::move
    無條件將左值轉換為右值引用,表示對象資源可被“移動”。用于觸發移動構造函數或移動賦值運算符,避免深拷貝。
    示例:
std::string s1 = "Hello";
std::string s2 = std::move(s1); // s1 的資源被移動到 s2,s1 不再有效
  • std::forward
    有條件地保持值類別(左值/右值),用于完美轉發。通常與萬能引用(T&&)配合,在泛型代碼中保持參數的原始類型。
    示例:
template<typename T>
void wrapper(T&& arg) {callee(std::forward<T>(arg)); // 保持 arg 的原始值類別
}

2. 轉換條件

  • std::move
    無論輸入是左值還是右值,始終返回右值引用。
auto rval = std::move(lval); // 無條件轉為右值
  • std::forward
    根據模板參數 T 的類型決定轉換行為:
forward<T>(arg); // 類型 T 決定結果
- 若 `T` 是左值引用(如 `int&`),返回左值引用。  
- 若 `T` 是非引用或右值引用(如 `int` 或 `int&&`),返回右值引用。

3. 實現機制

  • std::move** 實現**
template<typename T>
constexpr typename std::remove_reference<T>::type&& move(T&& t) noexcept {return static_cast<typename std::remove_reference<T>::type&&>(t);
}

直接通過 static_cast 將輸入轉換為右值引用。

  • std::forward** 實現**
template<typename T>
constexpr T&& forward(typename std::remove_reference<T>::type& t) noexcept {return static_cast<T&&>(t);
}

根據 T 的類型推斷結果,決定返回左值或右值引用。


4. 應用場景

  • 使用 std::move 的場景
    • 需要明確轉移對象資源所有權時(如實現移動構造函數)。
    • 避免拷貝開銷,例如將局部變量移動到容器中:
std::vector<std::string> vec;
std::string s = "data";
vec.push_back(std::move(s)); // 移動而非拷貝
  • 使用 std::forward 的場景
    • 泛型函數模板中轉發參數,保持其原始值類別:
template<typename... Args>
void emplace(Args&&... args) {container.emplace_back(std::forward<Args>(args)...); // 完美轉發參數包
}

總結

特性std::movestd::forward
目的強制轉為右值,觸發移動語義保持參數原始值類別,完美轉發
轉換條件無條件依賴模板參數 T
典型應用移動構造函數、避免拷貝泛型代碼中的參數轉發
參數類型接受任意類型通常與萬能引用 T&& 配合使用

補充:

//拷貝構造

MyStruct(const Mystruct &)

{

}

//移動構造

Mystruct( Mystruct &&) // 無const

{

}
萬能引用:
T&&

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82738.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Uniapp編寫微信小程序,使用canvas進行繪圖

一、canvas文檔&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial 二、數據繪制&#xff08;單位是像素&#xff09;&#xff1a; 1、繪制文本&#xff1a; 文字的長度超過設置的最大寬度&#xff0c;文字會縮在一起 ① 填充文本&#xf…

FLASH閃存(擦除、編譯)

FLASH閃存 文章目錄 FLASH閃存1.存儲器映像位置2.FLASH簡介3.閃存模塊組織3.2閃存的共性&#xff1a; 4.FLASH基本結構4.1FLASH解鎖4.2使用指針訪問寄存器 5.選項字節5.1選項字節編程5.2選項字節擦除 6.相關函數介紹7.讀取內部FLASH&#xff08;實操&#xff09;7.1接線圖7.2工…

PostgreSQL 序列(Sequence) 與 Oracle 序列對比

PostgreSQL 序列(Sequence) 與 Oracle 序列對比 PostgreSQL 和 Oracle 都提供了序列(Sequence)功能&#xff0c;但在實現細節和使用方式上存在一些重要差異。以下是兩者的詳細對比&#xff1a; 一 基本語法對比 1.1 創建序列 PostgreSQL: CREATE [ { TEMPORARY | TEMP } |…

12.2.2 allocator類

allocator類將分配內存空間、調用構造函數、調用析構函數、釋放內存空間這4部分操作分開&#xff0c;全部交給程序員來執行&#xff0c;不像new和delete #include <iostream> #include <string>int main() {const int n 10;std::allocator<std::string> al…

Android 中 Handler (創建時)內存泄漏問題及解決方案

一、Handler 內存泄漏核心原理 真題 1&#xff1a;分析 Handler 內存泄漏場景 題目描述&#xff1a; 在 Activity 中使用非靜態內部類 Handler 發送延遲消息&#xff0c;旋轉屏幕后 Activity 無法釋放&#xff0c;分析原因并給出解決方案。 內存泄漏鏈路分析&#xff1a; 引…

SSTI記錄

SSTI(Server-Side Template Injection&#xff0c;服務器段模板注入) 當前使用的一些框架&#xff0c;如python的flask、php的tp、java的spring&#xff0c;都采用成熟的MVC模式&#xff0c;用戶的輸入會先進入到Controller控制器&#xff0c;然后根據請求的類型和請求的指令發…

探索邊緣計算:賦能物聯網的未來

摘要 隨著物聯網&#xff08;IoT&#xff09;技術的飛速發展&#xff0c;越來越多的設備接入網絡&#xff0c;產生了海量的數據。傳統的云計算模式在處理這些數據時面臨著延遲高、帶寬不足等問題&#xff0c;而邊緣計算的出現為解決這些問題提供了新的思路。本文將深入探討邊緣…

tabs切換#

1、html <el-tabs v-model"tabValue" tab-change"handleTabClick"><el-tab-pane label"集群" name"1"></el-tab-pane><el-tab-pane label"節點" name"2"></el-tab-pane></el-ta…

JSON 實體屬性映射的最佳實踐

一、結構與命名規范 ?保持字段命名一致性? JSON 字段名與實體屬性名應遵循統一的命名規則&#xff08;如駝峰命名或下劃線分隔&#xff09;&#xff0c;避免因大小寫差異導致映射失敗。 // 使用 JsonProperty 顯式指定映射關系&#xff08;Jackson&#xff09; public class …

hiveserver2與beeline進行遠程連接hive配置及遇到的問題

1、hiveserver2 參與用戶模擬功能&#xff0c;因為開啟后才能保證各用戶之間的權限隔離。 1.1、配置 $HADOOP_HOME/etc/hadoop/core-site.xml <!--配置所有節點的root用戶都可作為代理用戶--> <property><name>hadoop.proxyuser.root.hosts</name>&…

硅基計劃2.0 學習總結 壹 Java初階

一、初見Java &#xff08;1&#xff09;Java簡介 首先不得不承認Java是一門優秀的程序設計語言 其系列的計算機軟件和跨平臺體系包括國內的生態鏈完善是C/C語言難以彌補的 &#xff08;2&#xff09;Java SE 全稱Java Standard Edition&#xff0c;是Java體系的基礎 &am…

nRF5_SDK_17.1.0_ddde560之ble_app_uart_c 出錯

Error #541: ARM::CMSIS:CORE:5.3.0 component is missing (previously found in pack ARM.CMSIS.5.6.0) Error #541: NordicSemiconductor::Device:Startup:8.40.3 component is missing (previously found in pack NordicSemiconductor.nRF_DeviceFamilyPack.8.40.3) 下載n…

基于大模型預測的多發性硬化綜合診療方案研究報告大綱

目錄 一、引言二、文獻綜述三、大模型預測系統構建四、術前預測與手術方案制定五、術中監測與決策支持六、術后護理與并發癥預測七、麻醉方案智能優化八、統計分析與技術驗證九、實驗驗證與證據支持十、健康教育與指導系統十一、結論與展望一、引言 (一)研究背景與意義 多發…

bootstrap自助(抽樣)法

一&#xff0c;概念 一言以蔽之&#xff1a;從訓練集中有放回的均勻抽樣——》本質就是有放回抽樣&#xff1b; 自助法&#xff08;bootstrap&#xff09;是一種通過從數據集中重復抽樣來估計統計量分布的非參數方法。它可用于構建假設檢驗&#xff0c;當對參數模型的假設存在…

用1W字講透數據預處理,數據增強

大家好&#xff01;我是我不是小upper~ 今天咱們來聊聊數據增強 —— 這個在機器學習領域堪稱 “數據魔法” 的實用技術&#xff01; 在深度學習的世界里&#xff0c;數據就像模型的 “養分”。數據的質量和數量&#xff0c;直接決定了模型最終能達到的 “高度”。當數據不足時…

無人機空中物流優化:用 Python 打造高效配送模型

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

C++核心編程解析:模板、容器與異常處理全指南

文章目錄 一、模板1.1 定義1.2 作用1.3 函數模版1.3.1 格式 1.4 類模版1.4.1 格式1.4.2 代碼示例1.4.3 特性 二、容器2.1 概念2.2 容器特性2.3 分類2.4 向量vector2.4.1 特性2.4.2 初始化與操作2.4.3 插入刪除 2.5 迭代器2.6 列表&#xff08;list&#xff09;2.6.1 遍歷方式2.…

JWT的介紹與在Fastapi框架中的應用

什么是JWT JWT (JSON Web Token) 是一個開放標準 ( RFC 7519 )&#xff0c;它定義了一種緊湊且自包含的方式&#xff0c;用于在各方之間安全地以 JSON 對象的形式傳輸信息。由于這些信息經過數字簽名&#xff0c;因此可以被驗證和信任。JWT 可以使用密鑰&#xff08;采用HMAC算…

dfs第二次加訓 詳細題解 下

目錄 B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全 思路 B4279 [藍橋杯青少年組國賽 2023] 數獨填數、 思路 P5198 [USACO19JAN] Icy Perimeter S 思路 P5429 [USACO19OPEN] Fence Planning S 思路 P6111 [USACO18JAN] MooTube S 思路 P6207 [USACO06OCT] Cows …

配置Hadoop集群環境準備

&#xff08;一&#xff09;Hadoop的運行模式 一共有三種&#xff1a; 本地運行。偽分布式完全分布式 &#xff08;二&#xff09;Hadoop的完全分布式運行 要模擬這個功能&#xff0c;我們需要做好如下的準備。 1&#xff09;準備3臺客戶機&#xff08;關閉防火墻、靜態IP、…