decltype是什么,什么作用?

基本概念

decltype 是 C++11 引入的關鍵字,用于推導表達式的類型,且會完整保留類型的細節(包括 const、引用 &、指針 * 等)。

語法:decltype(表達式) 變量名

核心特點

1.推導依據是表達式本身,而非表達式的結果(與 auto 不同)。
例:int x = 5; decltype(x) a; → a 的類型是 int(因 x 是 int)。
2.完整保留類型修飾符:

  • 若表達式是 const int&,則推導出的類型也是 const int&。
  • 若表達式是 int*,則推導出的類型也是 int*。

使用場景

1. 模板中推導復雜返回值類型

當模板函數的返回值類型依賴于參數類型,且無法通過 auto 直接推導時(如返回值是參數表達式的結果),decltype 能自動推導正確類型。

template<typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {  // 推導 a+b 的類型作為返回值return a + b;
}
int main(){int x = 1;double y = 2.5;auto result = add(x, y);  // 返回值類型自動推導為 double
}

2.?保留引用和?const?修飾符

auto會丟失引用和const,但decltype能完整保留。

int x = 10;
const int& ref = x;  // ref 是 const int&auto a = ref;        // a 是 int(丟失 const 和引用)
decltype(ref) b = x; // b 是 const int&(保留所有修飾符)

3.?推導容器元素的引用類型

在泛型代碼中,獲取容器元素的引用類型(如vector<int>::reference),避免拷貝。用auto占位,decltype實際推導。

#include <vector>template<typename Container>
auto get_first(Container& c) -> decltype(c[0]) {  // 返回容器元素的引用類型return c[0];
}// 使用:
std::vector<int> vec = {1, 2, 3};
get_first(vec) = 100;  // 修改原容器的第一個元素(返回值是 int&)

4.?捕獲 lambda 表達式的類型

lambda的類型是匿名的,只能用decltype捕獲。

auto lambda = [](int x) { return x * 2; };
decltype(lambda) another_lambda = lambda;  // 復制 lambda 類型

5.定義與成員指針同類型的變量

當類型涉及復雜的成員指針時,用decltype自動推導

struct Person {std::string name;int age;
};Person p{"Alice", 20};
decltype(&Person::age) ptr = &Person::age;  // ptr 指向 Person::age,類型是 int Person::*// 1. 訪問對象的成員
int value = p.*ptr;      // 等價于 p.age(通過對象訪問)
int value2 = (&p)->*ptr; // 等價于 p.age(通過指針訪問)// 2. 修改對象的成員
p.*ptr = 21;  // 等價于 p.age = 21;

實際場景(成員指針舉例)

用?decltype?簡化成員指針的類型聲明
struct Person {std::string name;int age;
};// 通用函數:修改 Person 的任意成員
template<typename T>
void set_member(Person& p, T Person::* member_ptr, T value) {p.*member_ptr = value;  // 統一修改成員的邏輯
}int main() {Person p{"Alice", 20};// 1. 動態選擇修改 age 成員(用 decltype 簡化類型聲明)decltype(&Person::age) age_ptr = &Person::age;  // 等價于 int Person::* age_ptrset_member(p, age_ptr, 21);  // 調用通用函數修改 age// 2. 動態選擇修改 name 成員(同樣用 decltype)decltype(&Person::name) name_ptr = &Person::name;  // 等價于 std::string Person::* name_ptrset_member(p, name_ptr, "Bob");  // 調用同一個通用函數修改 name// 結果:p.age=21,p.name="Bob"
}

decltype?在這個例子里的作用:

1.自動推導成員指針的復雜類型

  • &Person::age?的類型是?int Person::*(手動寫很繁瑣),decltype?直接推導出這個類型,避免手寫錯誤。
  • &Person::name?的類型是?std::string Person::*decltype?同樣能自動搞定。

2.適配通用函數
通用函數?set_member?需要知道成員的類型?Tdecltype?推導出的?age_ptr?和?name_ptr?能完美匹配函數的模板參數,讓同一個函數處理不同類型的成員(int?和?std::string)。

為什么必須用?decltype?

如果不用 decltype,就需要手動寫成員指針的類型:

int Person::* age_ptr = &Person::age;  // 繁瑣且容易寫錯
std::string Person::* name_ptr = &Person::name;

而用 decltype 只需 decltype(&Person::age) age_ptr,尤其是在成員類型復雜(比如自定義類型)時,decltype 能大幅減少代碼量和錯誤率。

與auto的區別與聯系

對比項decltypeauto
推導依據表達式的類型本身(不執行表達式)變量初始化的值(執行表達式)
類型保留完整保留?const、引用等修飾符會忽略引用(除非顯式加?&
適用場景推導復雜類型、模板返回值簡化變量定義(如?auto x = 5;

聯系:兩者常配合使用(如模板函數的尾隨返回類型),auto?占位,decltype?負責精準推導。

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

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

相關文章

RPC 與 Feign 的區別筆記

一、基本概念 1.1 RPC&#xff08;Remote Procedure Call&#xff09; 定義&#xff1a;遠程過程調用&#xff0c;允許像調用本地方法一樣調用遠程服務的方法。 本質&#xff1a;跨進程通信&#xff0c;隱藏了底層網絡通信的復雜性。 常見實現&#xff1a; Java 原生 RMIDub…

高防IP能夠防御CC攻擊嗎?它具備哪些顯著優勢?

摘要&#xff1a; 面對日益復雜的網絡攻擊&#xff0c;高防IP作為重要的安全工具&#xff0c;不僅能防御常見的DDoS攻擊&#xff0c;還能有效應對CC攻擊。本文將解析高防IP防御CC攻擊的原理及其核心優勢&#xff0c;幫助讀者了解其在網絡安全中的關鍵作用。一、高防IP能否防御C…

TypeScript 類型注解(一)

一、TypeScript 類型注解1、什么是TpyeScript類型注解- 是否還記得TypeScript的兩個重要特性&#xff1f;- 類型系統、適用于任何規模- 可以說&#xff0c;TS的類型系統是TS最重要的功能&#xff1b;那么什么是類型注解呢&#xff1f;其實就是在聲明變量時&#xff0c;將變量的…

弗蘭肯斯坦式的人工智能與GTM策略的崩潰

2025 年上半年已經明確了一件事&#xff1a;B2B 市場營銷團隊被工具淹沒&#xff0c;但缺乏策略。人工智能無處不在。收入領導者在進行無休止的試點。營銷團隊拼湊各種點解決方案&#xff0c;希望能實現規模擴張。然而&#xff0c;銷售線索的增長停滯不前。信譽正在受損。曾經承…

NAND閃存(NAND Flash)是什么?

NAND閃存(NAND Flash)是什么? NAND閃存(NAND Flash)詳解 NAND閃存是一種非易失性存儲介質(斷電不丟失數據),廣泛應用于SSD、U盤、手機存儲等設備中。NAND Flash 的全稱是 “Negative-AND Flash”(與非型閃存),其名稱源自其底層存儲單元的電路結構——基于**“與非門…

Android性能優化之UI渲染優化

一、UI渲染核心瓶頸深度解析 1. 渲染管線關鍵階段階段CPU工作GPU工作潛在卡頓點Measure計算View尺寸-嵌套布局多次測量Layout計算View位置-頻繁重排(Relayout)Draw構建DisplayList指令集-復雜自定義View.onDraw()Sync & Upload資源上傳到GPU內存紋理上傳大圖/未壓縮資源Ras…

基于Spring AI Alibaba的智能知識助手系統:從零到一的RAG實戰開發

&#x1f4d6; 項目概述 在人工智能快速發展的今天&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技術已成為構建智能問答系統的核心技術。本文將詳細介紹一個基于Spring AI Alibaba DashScope深度集成的智能知識助手系統的完整開發過程&#xff0c;…

VirtualBox + CentOS:啟用 DHCP 獲取 IPv4 地址

標題&#xff1a; VirtualBox CentOS&#xff1a;啟用 DHCP 獲取 IPv4 地址 日期&#xff1a; 2025-07-18 一、問題現象 最小化安裝的 CentOS 7 虛擬機里敲&#xff1a; ip addr輸出只有 lo 的 127.0.0.1 以及 enp0s3 的 IPv6 鏈路本地地址&#xff0c;沒有 IPv4&#xff0…

Git

Git簡介Git 是一個分布式版本控制工具&#xff0c;通常用來對軟件開發過程中的源代碼文件進行管理。通過Git 倉庫來存儲和管理這些文件&#xff0c;Git 倉庫分為兩種:本地倉庫:開發人員自己電腦上的 Git倉庫。遠程倉庫:遠程服務器上的 Git 倉庫。commit: 提交, 將本地文件和版本…

通信算法之294:LTE系統中的整數倍頻偏估計

在LTE系統中&#xff0c;整數倍頻偏估計主要通過以下方法實現&#xff1a;一、最大似然估計法&#xff08;ML&#xff09;通過遍歷預設的整數倍頻偏范圍&#xff08;如30kHz&#xff09;&#xff0c;將接收信號與本地的PSS序列在不同頻偏點上進行相關運算&#xff0c;選擇相關峰…

數字人直播:開啟直播行業新紀元?

?原始尺寸更換圖片p9-flow-imagex-sign.byteimg.com??在科技日新月異的當下&#xff0c;直播行業正經歷著一場深刻變革&#xff0c;數字人直播的興起&#xff0c;宛如一顆璀璨新星&#xff0c;照亮了直播領域的新征程。數字人直播&#xff0c;是利用先進的人工智能技術&…

朝鮮升級供應鏈惡意軟件XORIndex,再次瞄準npm生態系統

Socket威脅研究團隊最新披露&#xff0c;朝鮮國家支持的黑客組織在"傳染性面試"攻擊活動中采用了新型惡意軟件加載器XORIndex&#xff0c;該惡意程序專門通過npm軟件包注冊表滲透軟件供應鏈。攻擊規模與持續性此次攻擊并非孤立事件&#xff0c;而是針對開發者、求職者…

Windows 下 VS2019 編譯 libevent-2.1.10 庫

1. 你需要VS2019 編譯好openssl-1.1.1 &#xff0c;這個具體編譯或者下載可以參考我的博客openssl生成的庫是這兩個文件接下來&#xff0c;打開CMake &#xff0c;主要是下面的需要設置好最后Config Generate即可&#xff1b;全部成功生成 22個然后INSTALL右鍵生成 最后看下生…

Vim多列操作指南

我們在使用 Vim 時&#xff0c;經常需要同時編輯多個文件&#xff0c;或者同一個文件的不同部分。Vim 提供了分割窗口&#xff08;split&#xff09;和垂直分割窗口&#xff08;vsplit&#xff09;的功能&#xff0c;允許我們在同一個 Vim 會話中查看多個緩沖區&#xff08;buf…

Python網絡爬蟲實現selenium對百度識圖二次開發以及批量保存Excel

一.百度識圖自動上傳圖片from selenium import webdriver from selenium.webdriver.edge.options import Options from selenium.webdriver.common.by import By edge_options Options() edge_options.binary_location r"C:\Program Files (x86)\Microsoft\Edge\Applica…

Vue中的refs字段使用記錄

這段代碼是 Vue.js 中結合 Element UI 等 UI 庫的典型表單驗證寫法&#xff0c;具體含義如下&#xff1a;代碼拆解 this.$refs.fromData.validate((valid) > {// 驗證后的回調邏輯 })this.$refs.fromData $refs 是 Vue 提供的特殊屬性&#xff0c;用于訪問模板中通過 ref&qu…

多方案對比分析:后端數據加密策略及實踐

多方案對比分析&#xff1a;后端數據加密策略及實踐 隨著互聯網業務對用戶隱私和數據安全的要求不斷提升&#xff0c;后端系統中對敏感數據的加密保護已成為必備需求。從對稱加密、非對稱加密到數據庫透明加密、應用層字段加密&#xff0c;各種方案各有特點。本文將以方案對比分…

《Java語言程序設計》1.4 復習題

1.4.1 什么是操作系統?列出一些流行的操作系統?操作系統(Operating System)是運行在計算機上的最重要的程序。操作系統管理和控制計算機的活動。通用計算機的流行操作系統有Microsoft Windows、Mac OS以及Linux。如果沒有在計算機上安裝和運行操作系統&#xff0c;像Web瀏覽器…

OpenCV圖像自動縮放(Autoscaling)函數autoscaling()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于對輸入圖像進行自動縮放&#xff08;Autoscaling&#xff09;&#xff0c;即根據輸入圖像的像素值范圍將其線性映射到一個新的范圍內&am…

多線程的認識

競爭與協作在單核 CPU 系統里&#xff0c;為了實現多個程序同時運行的假象&#xff0c;操作系統通常以時間片調度的方式&#xff0c;讓每個進程執行每次執行一個時間片&#xff0c;時間片用完了&#xff0c;就切換下一個進程運行&#xff0c;由于這個時間片的時間很短&#xff…