c++中auto與decltype使用

在 C++11及后續版本中,關鍵字autodecltype都是用于類型推導的,但它們的使用場景和行為有所不同。

1.?auto?關鍵字

作用

auto?用于自動推導變量的類型,由編譯器根據初始化表達式來確定。

常見用法
// 基本用法
auto x = 42;        // int
auto y = 3.14;      // double
auto z = "hello";   // const char*// 復雜類型簡化
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();  // std::vector<int>::iterator// 函數返回值推導(C++14及以后)
auto add(int a, int b) {return a + b;  // 返回類型為int
}
注意事項
  1. 必須初始化auto?變量必須在定義時初始化,否則編譯器無法推導類型。
  2. 引用和 cv 限定符auto?通常會忽略引用和頂層?const,除非顯式指定:
    const int& ref = x;
    auto a = ref;    // a是int(忽略引用和頂層const)
    auto& b = ref;   // b是const int&(保留引用和const)
    
  3. 模板類型推導規則auto?使用與模板類型推導相同的規則(T?推導)。

2.?decltype?關鍵字

作用

decltype?用于獲取表達式的類型,而不實際計算表達式的值。

常見用法
int x = 42;
decltype(x) y = 0;  // y的類型是int// 復雜類型
std::vector<int> vec;
decltype(vec.size()) size = vec.size();  // std::vector<int>::size_type// 函數返回值類型推導(C++11及以后)
template<typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {return a + b;
}
類型推導規則
  • 變量名decltype(var)?返回變量的聲明類型(包括引用和 cv 限定符)。
  • 表達式decltype((var))?返回引用類型(因為表達式是左值)。
  • 函數調用decltype(func())?返回函數返回值的聲明類型。
int x = 42;
decltype(x) a = x;     // a是int
decltype((x)) b = x;   // b是int&(因為(x)是左值表達式)

3.?decltype(auto)(C++14)

作用

decltype(auto)?用于精確推導類型,保留引用和 cv 限定符,通常用于轉發函數或返回引用的函數。

int& func(int& x) { return x; }auto a = func(x);        // a是int(丟失引用)
decltype(auto) b = func(x);  // b是int&(保留引用)

4. 對比總結

特性autodecltype
推導依據初始化表達式的類型表達式的類型(不計算值)
引用和 cv 限定符通常忽略頂層 const 和引用保留所有類型信息
適用場景變量定義、函數返回值簡化模板元編程、返回類型后置
特殊形式auto&&(通用引用)decltype(auto)(精確推導)

5. 示例

泛型容器遍歷
std::map<std::string, int> dict = {{"apple", 1}, {"banana", 2}};
for (const auto& pair : dict) {  // pair是const std::pair<const std::string, int>&// 使用pair.first, pair.second
}
元編程
template<typename T, typename U>
auto max(T a, U b) -> decltype(a > b ? a : b) {return a > b ? a : b;
}

總結

  • auto:適合簡化類型名,由初始化表達式推導類型。
  • decltype:適合精確獲取表達式的類型,常用于模板元編程或保留引用。
  • decltype(auto):結合兩者優點,用于精確轉發或返回引用。

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

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

相關文章

LabVIEW機器視覺零件檢測

基于LabVIEW 圖形化編程平臺與機器視覺技術&#xff0c;構建集圖像采集、處理、尺寸計算與合格性分析于一體的自動化檢測方案。通過模塊化硬件架構與自適應算法設計&#xff0c;實現對機械零件多維度尺寸的非接觸式高精度測量&#xff0c;相比人工檢測效率提升 12 倍&#xff0…

大數據治理域——實時數據開發

摘要 本文深入探討了大數據治理域中的實時數據開發&#xff0c;重點介紹了流式數據處理的核心價值、特點、技術挑戰、典型能力和應用場景。同時&#xff0c;詳細闡述了流式技術架構&#xff0c;包括數據采集、處理、存儲和服務等環節&#xff0c;并針對大促場景提出了相應的技…

Halcon/C# 圖像窗口、讀取圖片及仿射變換

一、Halcon 清理窗口 清除圖像窗口的顯示。 dev_clear_window() 二、Halcon 讀取圖片 (一) 讀取一張圖片 read_image (Image, printer_chip/printer_chip_01)Image&#xff1a;&#xff08;輸出參數&#xff09;讀取到的圖片變量名 第二個參數&#xff1a;圖片路徑&#xf…

Nginx 反向代理服務和安裝docker-compose

Nginx 反向代理服務和安裝docker-compose Nginx Proxy Manager 他是一個可視化的nginx的反向代理神器&#xff0c;動動手指輕松的配置Nginx&#xff0c;我們可以通過一些網頁&#xff0c;即可完成網站的代理配置&#xff0c;無需在動手安裝Nginx&#xff1b; dockoer-compose部…

FPGA基礎 -- Verilog 鎖存器簡介

由淺入深地講解 Verilog 中的鎖存器&#xff08;Latch&#xff09;**&#xff0c;包括&#xff1a; 什么是鎖存器&#xff08;定義與作用&#xff09;鎖存器的分類&#xff08;透明鎖存器 vs 邊沿觸發器&#xff09;Verilog 中鎖存器的建模方式鎖存器與觸發器的區別鎖存器的時…

Eclipse Memory Analyzer (MAT) 相關配置調整

一、JDK版本過低提示 已安裝高于 jdk 17 的版本依舊提示 jdk 版本過低&#xff0c;打開MAT的安裝目錄&#xff0c;在配置文件 MemoryAnalyzer.ini 中添加配置指向JDK即可。新增兩行配置&#xff1a; -vm D:/jdk_21.0.7/bin/javaw.exe //jdk安裝路徑 bin 目錄下的javaw.exe二…

機器學習常用評估指標

機器學習常用評估指標 機器學習的評價指標有精度、精確率、召回率、P-R曲線、F1 值、TPR、FPR、ROC等指標&#xff0c;還有在生物領域常用的敏感性、特異性等指標。 基礎 在分類任務中&#xff0c;各指標的計算基礎都來自于對正負樣本的分類結果&#xff0c;用混淆矩陣表示&…

視頻相似度檢測算法(帶課設報告)

摘 要 本文提出了一種基于關鍵幀特征提取的視頻相似度檢測方法&#xff0c;通過融合自適應采樣與特征降維技術實現高效準確的視頻內容比對。系統采用三階段處理流程&#xff1a;首先對輸入視頻進行自適應關鍵幀采樣&#xff0c;通過均勻間隔算法提取固定數量&#xff08;默…

微服務江湖的愛恨情仇:Spring Cloud 與 Kubernetes 的雙雄演義

引言&#xff1a;雙雄并立&#xff0c;一個時代的序幕 微服務革命&#xff0c;如同一場燎原之火&#xff0c;將龐大、笨重的單體應用燒成灰燼&#xff0c;宣告了一個敏捷、獨立、快速迭代的新紀元。然而&#xff0c;這場革命在摧毀舊世界的同時&#xff0c;也催生了一片混沌的新…

深度拆解RAGFlow分片引擎之切片實現

上一篇深度拆解RAGFlow分片引擎&#xff01;3大階段視覺增強&#xff0c;全網最硬核架構解析 講了切片的整體流程&#xff0c;今天我們來拆下切片的實現。 我們在設置的時候&#xff0c;可以選擇切片方法。這個參數是parser_id 在創建知識庫的時候&#xff0c;選擇對應的切片方…

CSS平滑滾動效果實現方法

一、純CSS實現方案 使用 scroll-behavior 屬性 屬性值 auto (默認值)&#xff1a;滾動框立即滾動smooth&#xff1a;滾動框以平滑的方式滾動 /* 全局平滑滾動 */ html {scroll-behavior: smooth; }/* 特定容器平滑滾動 */ .scroll-container {scroll-behavior: smooth;over…

李沐動手深度學習(pycharm中運行筆記)——12.權重衰退

12.權重衰退&#xff08;與課程對應&#xff09; 目錄 一、權重衰退 1、使用均方范數作為硬性限制 2、使用均方范數作為柔性限制&#xff08;通常這么做&#xff09; 3、演示對最優解的影響 4、參數更新法則 5、總結 二、代碼實現從零實現 三、代碼實現簡介實現 一、權重…

React Native【實戰范例】同步跟隨滾動

最終效果 實現原理 主動滾動區觸發滾動事件&#xff0c;原生監聽滾動值的變化&#xff0c;并用動畫的方式實時同步到跟隨滾動區 技術要點 使用 Animated.ScrollView 使用動畫變量 const scrollY useRef(new Animated.Value(0)).current;主動滾動觸發 onScroll&#xff0c;用 …

如何僅用AI開發完整的小程序<3>—創建小程序基礎框架

1、啟動小程序開發者工具-選擇小程序&#xff0c;點擊 2、創建一個項目工程 項目名稱&#xff1a;自己填默認的也行&#xff0c;最好不要中文&#xff0c;拼音也行 目錄&#xff1a;選擇你的項目創建路徑 AppID&#xff1a;可以先點測試號&#xff0c;后面再替換自己的AppID就…

SQL等價改寫優化

or 與 union all的優化 在SQL開發中&#xff0c;我們經常會遇到這樣的情況&#xff1a;需要組合多個相似但略有不同的查詢結果。大多數開發者本能地使用UNION/UNION ALL來解決&#xff0c;這種方式直觀易懂&#xff0c;但在特定場景下卻隱藏著巨大的性能浪費。 本案例將從執行…

【已解決】 數據庫INSERT操作時,Column count doesn’t match value count at row 1

【已解決】數據庫INSERT操作時&#xff0c;ColumnColumn count doesn’t match value count at row 1 在開發過程中&#xff0c;我們經常會遇到數據庫操作錯誤&#xff0c;其中之一就是 MySQL 中的 “Column count doesn’t match value count at row1” 錯誤。這個錯誤通常發…

管件接頭的無序抓取

文章目錄 1&#xff0c;目的2&#xff0c;過程3&#xff0c;易混易錯點4&#xff0c;代碼詳解4.1&#xff0c;初始化窗口4.2&#xff0c;創建多視角立體視覺模型。4.3&#xff0c;創建表面匹配模型4.4&#xff0c;多視角立體視覺重建管件堆表面模型4.5&#xff0c;管道接頭查找…

移遠通信 × 紫光展銳,推動FWA “5G+AI”新體驗

6月19日&#xff0c;在2025 MWC上海期間&#xff0c;移遠通信宣布&#xff0c;攜手紫光展銳&#xff0c;推出面向下一代CPE應用的“5GAI”融合解決方案。目前雙方正聯合多家CPE廠商開展方案深度調優&#xff0c;以加速5GAI CPE終端的產業化落地進程。 該方案以移遠5G模組RG620…

深入理解Grad-CAM:用梯度可視化神經網絡的“注意力“

深入理解Grad-CAM&#xff1a;用梯度可視化神經網絡的"注意力" 引言 在深度學習的發展過程中&#xff0c;模型的可解釋性一直是一個重要的研究方向。盡管現代神經網絡在圖像識別、自然語言處理等任務上取得了令人矚目的成果&#xff0c;但它們往往被稱為"黑盒…

離線環境jenkins構建前端部署鏡像

gitlabjenkins 實現前端項目打包成 docker 鏡像&#xff1b;gitlab部署就不贅述了&#xff1b;因部署的gitlab版本的webhooks有問題&#xff0c;無法進行配置,所以文章的構建是手動觸發的。并且nodejs部署應該也能跟docker一樣直接安裝進jenkins的鏡像(但是多版本可能就有其他問…