在C++11及后續標準中,auto和decltype是用于類型推導的關鍵特性,它們的作用和用法。

在C++11及后續標準中,autodecltype是用于類型推導的關鍵特性,它們的作用和用法有所不同。以下是詳細說明:


1. auto 關鍵字

基本作用
  • 自動推導變量的類型(根據初始化表達式)
  • 主要用于簡化代碼,避免顯式書寫冗長類型名
使用場景
auto x = 42;          // x被推導為int
auto str = "hello";   // str被推導為const char*
auto vec = std::vector<int>{1,2,3}; // 推導為std::vector<int>
高級特性
  • 與引用/常量結合

    const auto& ref = x;  // 推導為 const int&
    auto* ptr = &x;       // 推導為 int*
    
  • 在范圍for循環中使用

    for (auto& elem : vec) { /* elem 推導為 int& */ }
    
  • 返回值類型推導(C++14起):

    auto add(int a, int b) { return a + b; } // 返回類型推導為 int
    
特殊規則
  • 引用類型:需顯式指定

    int y = 10;
    auto& ref = y;  // ref是int&
    
  • const限定:需顯式指定

    const auto pi = 3.14159; // pi是const double
    
  • 數組退化:會退化為指針

    int arr[3] = {1,2,3};
    auto ptr = arr;  // ptr是int*
    
限制
  • 不能用于函數參數(C++20前)

  • 不能推導非靜態成員變量類型

  • 頂層const會被忽略,需顯式聲明:

    const int y = 10;
    auto z = y;  // z 是 int 而非 const int
    


2. decltype 關鍵字

基本作用
  • 推導表達式的精確類型(包括引用/const限定等)
  • 不執行實際計算,僅分析類型
使用場景
int a = 10;
decltype(a) b = 20;   // b的類型與a相同(int)
decltype((a)) c = b;  // (a)是左值表達式,c被推導為int&
典型用途
  1. 模板編程:依賴參數類型的返回值

    template<typename T, typename U>
    auto add(T t, U u) -> decltype(t + u) {return t + u;
    }
    
  2. 獲取復雜表達式類型

    std::map<std::string, int> m;
    decltype(m.begin()) iter;  // 迭代器類型
    
auto的區別

在這里插入圖片描述


3. 組合使用(C++14+)

decltype(auto)
  • 結合兩者特性:像auto一樣自動推導,但保留decltype的類型規則

    int x = 10;
    int& getRef() { return x; }

    auto y = getRef(); // y是int(值拷貝)
    decltype(auto) z = getRef(); // z是int&(引用保留)

應用場景
  • 完美轉發返回值

    template<typename F>
    decltype(auto) call(F f) { return f(); }
    

4. 注意事項

  1. auto推導可能產生意外類型(如推導出std::initializer_list

  2. decltype對變量和表達式有不同處理:

    int i;
    decltype(i)   &rarr; int
    decltype((i)) &rarr; int&
    
  3. 在模板元編程中優先使用decltype保證類型精確性

如果需要具體場景的代碼示例或進一步解釋某個細節,可以提出補充問題。

在C++中,autodecltype都是用于類型推導的關鍵字,但它們的機制和應用場景有所不同。以下是詳細解析:


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

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

相關文章

Linux:進程程序替換execl

目錄 引言 1.單進程版程序替換 2.程序替換原理 3.6種替換函數介紹 3.1 函數返回值 3.2 命名理解 3.3 環境變量參數 引言 用fork創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分支)&#xff0c;我們所創建的所有的子進程&#xff0c;執行的代碼&#x…

LeetCode.02.04.分割鏈表

分割鏈表 給你一個鏈表的頭節點 head 和一個特定值 x &#xff0c;請你對鏈表進行分隔&#xff0c;使得所有 小于 x 的節點都出現在 大于或等于 x 的節點之前。 你不需要 保留 每個分區中各節點的初始相對位置。 示例 1&#xff1a; 輸入&#xff1a;head [1,4,3,2,5,2], x …

Johnson算法 流水線問題 java實現

某印刷廠有 6項加工任務J1&#xff0c;J2&#xff0c;J3&#xff0c;J4&#xff0c;J5&#xff0c;J6&#xff0c;需要在兩臺機器Mi和M2上完 成。 在機器Mi上各任務所需時間為5,1,8,5,3,4單位; 在機器M2上各任務所需時間為7,2,2,4,7,4單位。 即時間矩陣為&#xff1a; T1 {5, …

按鍵++,--在操作uint8_t類型(一個取值為1~10的數)中,在LCD中顯示兩位數字問題

問題概況 在執行按鍵&#xff0c;--過程中&#xff0c;本來數值為1~10.但是在執行過程中&#xff0c;發現數值在經過10數值后&#xff0c;后面的“0”會一直在LCD顯示屏中顯示。 就是執行操作中&#xff0c;從1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xf…

【QT】QTreeWidgetItem的checkState/setCheckState函數和isSelected/setSelected函數

目錄 1、函數原型1.1 checkState/setCheckState1.2 isSelected/setSelected2、功能用途3、示例QTreeWidget的checkState/setCheckState函數和isSelected/setSelected這兩組函數有著不同的用途,下面具體說明: 1、函數原型 1.1 checkState/setCheckState Qt::CheckState QTr…

005 vue項目結構 vue請求頁面執行流程(vue2)

文章目錄 vue項目結構vue請求頁面執行流程main.jsrouterHelloWorld.vueApp.vueindex.html vue項目結構 config目錄存放的是配置文件&#xff0c;比如index.js可以配置端口 node_modules存放的是該項目依賴的模塊&#xff0c;這些依賴的模塊在package.json中指定 src目錄分析 1…

匯豐xxx

1. Spring Boot 的了解&#xff0c;解決什么問題&#xff1f; 我的理解&#xff1a; Spring Boot 是一個基于 Spring 框架的快速開發腳手架&#xff0c;它簡化了 Spring 應用的初始搭建和開發過程。解決的問題&#xff1a; 簡化配置&#xff1a; 傳統的 Spring 應用需要大量的…

基于 Spring Boot 瑞吉外賣系統開發(一)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;一&#xff09; 系統概述 系統功能 技術選型 初始項目和數據準備 初始項目和SQL文件下載 創建數據庫并導入數據 打開reggie項目 運行效果 主函數啟動項目&#xff0c;訪問URL&#xff1a; http://127.0.0.1:8080/backend/pag…

大型語言模型智能應用Coze、Dify、FastGPT、MaxKB 對比,選擇合適自己的LLM工具

大型語言模型智能應用Coze、Dify、FastGPT、MaxKB 對比&#xff0c;選擇合適自己的LLM工具 Coze、Dify、FastGPT 和 MaxKB 都是旨在幫助用戶構建基于大型語言模型 (LLM) 的智能應用的平臺。它們各自擁有獨特的功能和側重點&#xff0c;以下是對它們的簡要對比&#xff1a; Coz…

【項目管理】第6章 信息管理概論 --知識點整理

項目管理 相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知識總覽 項目管理知識域 知識點&#xff1a; &#xff08;項目管理概論、立項管理、十大知識域、配置與變更管理、績效域&#xff09; 對應&…

Zapier MCP:重塑跨應用自動化協作的技術實踐

引言&#xff1a;數字化協作的痛點與突破 在當今多工具協同的工作環境中&#xff0c;開發者與辦公人員常常面臨數據孤島、重復操作等效率瓶頸。Zapier推出的MCP&#xff08;Model Context Protocol&#xff09;協議通過標準化數據交互框架&#xff0c;為跨應用自動化提供了新的…

echart實現動態折線圖(vue3+ts)

最近接到個任務&#xff0c;需要用vue3實現動態折線圖。之前沒有用過&#xff0c;所以一路坎坷&#xff0c;現在記錄一下&#xff0c;以后也好回憶一下。 之前不清楚echart的繪制方式&#xff0c;以為是在第一秒的基礎上繪制第二秒&#xff0c;后面實驗過后&#xff0c;發現并…

Java學習——day24(反射進階:注解與動態代理)

文章目錄 1. 反射與注解2. 動態代理3. 實踐&#xff1a;編寫動態代理示例4. 注解定義與使用5. 動態代理6. 小結與思考 1. 反射與注解 注解&#xff1a;注解是 Java 提供的用于在代碼中添加元數據的機制。它不會影響程序的執行&#xff0c;但可以在運行時通過反射獲取和處理。反…

C++之nullptr

文章目錄 前言 一、NULL 1、代碼 2、結果 二、nullptr 1、代碼 2、結果 總結 前言 當我們談論空指針時,很難避免談及nullptr。nullptr是C++11引入的一個關鍵字,用來表示空指針。在C++中,空指針一直是一個容易引起混淆的問題,因為在早期版本的C++中,通常使用NULL來…

JavaScript惰性加載優化實例

這是之前的一位朋友的酒桌之談&#xff0c;他之前負責的一個電商項目&#xff0c;剛剛開發萬&#xff0c;首頁加載時間特別長&#xff0c;體驗很差&#xff0c;所以就開始排查&#xff0c;發現是在首頁一次性加載所有js導致的問題&#xff0c;這個問題在自己學習的時候并不明顯…

蘋果內購支付 Java 接口

支付流程&#xff0c;APP支付成功后 前端調用后端接口&#xff0c;后端接口將前端支付成功后拿到的憑據傳給蘋果服務器檢查&#xff0c;如果接口返回成功了&#xff0c;就視為支付。 代碼&#xff0c;productId就是蘋果開發者后臺提前設置好的 產品id public CommonResult<S…

數據庫中的數組: MySQL與StarRocks的數組操作解析

在現代數據處理中, 數組 (Array) 作為一種高效存儲和操作結構化數據的方式, 被廣泛應用于日志分析, 用戶行為統計, 標簽系統等場景. 然而, 不同數據庫對數組的支持差異顯著. 本文將以MySQL和StarRocks為例, 深入解析它們的數組操作能力, 并對比其適用場景. 文章目錄 一 為什么需…

LeetCode零錢兌換(動態規劃)

題目描述 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。 計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額&#xff0c;返回 -1 。 你可以認為每種硬幣的數量是無…

/sys/fs/cgroup/memory/memory.stat 關鍵指標說明

目錄 1. **total_rss**2. **total_inactive_file**3. **total_active_file**4. **shmem**5. **其他相關指標**總結 以下是/sys/fs/cgroup/memory/memory.stat文件中一些關鍵指標的詳細介紹&#xff0c;特別是與PostgreSQL相關的指標&#xff1a; 1. total_rss 定義&#xff1…

C++第14屆藍橋杯b組學習筆記

1. 日期統計 小藍現在有一個長度為 100100 的數組&#xff0c;數組中的每個元素的值都在 00 到 99 的范圍之內。數組中的元素從左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…