C++11新特性_自動類型推導_auto

? ? ? ?在 C++11 標準中,auto關鍵字被賦予了全新且強大的功能,它用于自動類型推導,即編譯器能夠根據變量的初始化表達式自動確定其類型

基本語法

使用auto聲明變量時,只需給出auto關鍵字,后面緊跟變量名,并對其進行初始化,編譯器會根據初始化表達式來推導變量的類型。基本形式如下:

auto variable = initializer;

應用場景和優點

? ? ? ?代碼簡潔:減少了手動指定類型的冗長代碼,尤其是在處理復雜類型時,能讓代碼更加簡潔易讀。
? ? ? 提高可維護性:當類型發生變化時,使用auto可以避免手動修改類型聲明,減少出錯的可能性。

1. 簡單數據類型推導

#include <iostream>int main() {auto num = 10;  // 推導為 int 類型auto pi = 3.14; // 推導為 double 類型auto str = "hello"; // 推導為 const char* 類型std::cout << "num 的類型: " << typeid(num).name() << std::endl;std::cout << "pi 的類型: " << typeid(pi).name() << std::endl;std::cout << "str 的類型: " << typeid(str).name() << std::endl;return 0;
}

? ? ?在上述代碼中,num根據初始化值10被推導為int類型,pi根據3.14被推導為double類型,str根據字符串字面量被推導為const char*類型。

2. 復雜類型推導

當處理復雜類型,如容器的迭代器時,auto的優勢更加明顯。

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 傳統方式聲明迭代器std::vector<int>::iterator it1 = vec.begin();// 使用 auto 聲明迭代器auto it2 = vec.begin();std::cout << "傳統方式迭代器訪問元素: " << *it1 << std::endl;std::cout << "使用 auto 迭代器訪問元素: " << *it2 << std::endl;return 0;
}

? ? ? 這里,使用auto聲明迭代器it2時,無需寫出冗長的std::vector<int>::iterator類型,編譯器會自動推導其類型,使代碼更加簡潔。

3. Lambda 表達式類型推導

? ?Lambda 表達式的類型是編譯器自動生成的,沒有明確的類型名,使用auto可以方便地存儲 Lambda 表達式。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用 auto 存儲 Lambda 表達式auto printNumber = [](int num) {std::cout << num << " ";};std::for_each(numbers.begin(), numbers.end(), printNumber);std::cout << std::endl;return 0;
}

? printNumber是一個 Lambda 表達式,使用auto來存儲它,避免了處理復雜且無明確名稱的 Lambda 表達式類型。

注意事項和不足

? ? ? ?必須初始化:使用auto聲明變量時必須進行初始化,因為編譯器需要根據初始化表達式來推導類型。
? ? ? ?類型推導的局限性auto在推導類型時可能會忽略頂層const、引用,數組等屬性,需要根據具體情況顯式指定。

? ? ? ?必須初始化比較好理解,以下詳細介紹類型推導的局限性相關情況及解決辦法。

1. 頂層?const?被忽略

? ? ? ?在 C++ 里,const?有頂層?const?和底層?const?之分。頂層?const?表示對象本身是常量,而底層?const?表示指針或引用所指向的對象是常量。當使用?auto?推導類型時,頂層?const?會被忽略,但底層?const?會被保留。

#include <iostream>int main() {const int a = 10; // 頂層 constauto b = a; // b 的類型是 int,頂層 const 被忽略// b = 20; // 可以修改 b,因為 b 不是 conststd::cout << "b 的類型: " << typeid(b).name() << std::endl; // b 的類型: iconst int* c = &a; // 底層 constauto d = c; // d 的類型是 const int*,底層 const 被保留// *d = 30; // 錯誤,不能通過 d 修改其所指向的值std::cout << "d 的類型: " << typeid(d).name() << std::endl;  //d 的類型: PKireturn 0;
}

? ? 在上述代碼中,變量?a?是頂層?const,使用?auto?推導?b?的類型時,頂層?const?被忽略,所以?b?是普通的?int?類型,可以對其進行修改。而指針?c?包含底層?const,使用?auto?推導?d?的類型時,底層?const?被保留,因此不能通過?d?修改其所指向的值。
? ?如果希望保留頂層?const,可以顯式指定?const auto

const int a = 10;
const auto b = a; // b 的類型是 const int,保留了頂層 const
// b = 20; // 錯誤,不能修改 b

2. 引用屬性被忽略

? ? ? 當初始化表達式是引用類型時,auto?會忽略引用屬性,推導出的是被引用對象的類型。若要保留引用類型,需要顯式指定。

#include <iostream>int main() {int num = 10;int& ref = num;auto e = ref; // e 的類型是 int,而不是 int&e = 20; // 修改 e 不會影響 numauto& f = ref; // f 的類型是 int&,保留了引用屬性f = 30; // 修改 f 會影響 numstd::cout << "num: " << num << std::endl; // 輸出 30return 0;
}

? ? ? ??在這個例子中,ref?是?num?的引用,使用?auto?推導?e?的類型時,引用屬性被忽略,e?是普通的?int?類型,修改?e?不會影響?num。而使用?auto&?推導?f?的類型時,保留了引用屬性,f?是?int&?類型,修改?f?會影響?num

3. 數組退化為指針

? ? ? ? ? 當使用?auto?推導數組類型時,數組會退化為指針。

#include <iostream>int main() {int arr[5] = {1, 2, 3, 4, 5};auto g = arr; // g 的類型是 int*,數組退化為指針return 0;
}

? ? ? 在上述代碼中,arr?是一個包含 5 個?int?元素的數組,使用?auto?推導?g?的類型時,數組退化為指針,g?的類型是?int*

? ? ? 綜上所述,在使用?auto?進行類型推導時,需要注意這些局限性,根據具體情況顯式指定類型,以確保得到預期的結果。

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

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

相關文章

[預備知識]6. 優化理論(二)

優化理論 本章節介紹深度學習中的高級優化技術&#xff0c;包括學習率衰減、梯度裁剪和批量歸一化。這些技術能夠顯著提升模型的訓練效果和穩定性。 學習率衰減&#xff08;Learning Rate Decay&#xff09; 數學原理與可視化 學習率衰減策略的數學表達&#xff1a; 步進式…

【計算機視覺】語義分割:Mask2Former:統一分割框架的技術突破與實戰指南

深度解析Mask2Former&#xff1a;統一分割框架的技術突破與實戰指南 技術架構與創新設計核心設計理念關鍵技術組件 環境配置與安裝指南硬件要求安裝步驟預訓練模型下載 實戰全流程解析1. 數據準備2. 配置文件定制3. 訓練流程4. 推理與可視化 核心技術深度解析1. 掩膜注意力機制…

數字智慧方案5857丨智慧機場解決方案與應用(53頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧機場解決方案與應用 詳細資料請看本解讀文章的最后內容。 隨著科技的飛速發展&#xff0c;智慧機場的建設已成為現代機場發展的重要方向。智慧機場不僅提升了旅客的出行體驗&#xff0c;還極大地提高了機場的運營效率。本文將詳細解讀沃土數字平臺在…

【C到Java的深度躍遷:從指針到對象,從過程到生態】第五模塊·生態征服篇 —— 第二十章 項目實戰:從C系統到Java架構的蛻變

一、跨語言重構&#xff1a;用Java重寫Redis核心模塊 1.1 Redis的C語言基因解析 Redis 6.0源碼核心結構&#xff1a; // redis.h typedef struct redisObject { unsigned type:4; // 數據類型&#xff08;String/List等&#xff09; unsigned encoding:4; // …

ES6異步編程中Promise與Proxy對象

Promise 對象 Promise對象用于解決Javascript中的地獄回調問題&#xff0c;有效的減少了程序回調的嵌套調用。 創建 如果要創建一個Promise對象&#xff0c;最簡單的方法就是直接new一個。但是&#xff0c;如果深入學習&#xff0c;會發現使用Promise下的靜態方法Promise.re…

UE自動索敵插件Target System Component

https://www.fab.com/zh-cn/listings/9088334d-3bde-4e10-a937-baeb780f880f ? 一個完全用 C 編寫的 UE插件&#xff0c;添加了對簡單相機鎖定/瞄準系統的支持。它最初??在藍圖中開發和測試&#xff0c;然后轉換并重寫為 C 模塊和插件。 特征&#xff1a; 可通過一組可在…

中小企業MES系統概要設計

版本&#xff1a;V1.0 日期&#xff1a;2025年5月2日 一、系統架構設計 1.1 整體架構模式 采用分層微服務架構&#xff0c;實現模塊解耦與靈活擴展&#xff0c;支持混合云部署&#xff1a; #mermaid-svg-drxS3XaKEg8H8rAJ {font-family:"trebuchet ms",verdana,ari…

STM32移植U8G2

STM32 移植 U8G2 u8g2 &#xff08;Universal 8bit Graphics Library version2 的縮寫&#xff09;是用于嵌入式設備的單色圖形庫&#xff0c;可以在單色屏幕中繪制 GUI。u8g2 內部附帶了例如 SSD13xx&#xff0c;ST7xx 等很多 OLED&#xff0c;LCD 驅動。內置多種不同大小和風…

Langchain,為何要名為langchian?

來聽聽 DeepSeek 怎么說 Human 2025-05-02T01:13:43.627Z langchain 是一個大語言模型開發框架。我的理解中&#xff0c;lang 是詞根"語言"&#xff0c;chain是單詞"鏈"&#xff0c;langchain 便是將語言模型和組件串聯成鏈的框架。而 langchain 的圖標是…

Windows下Python3腳本傳到Linux下./example.py執行失敗

1. 背景 大多數情況下通過pycharm編寫Python代碼&#xff0c;編寫調試完&#xff0c;到Linux下發布執行。 以example.py腳本為例 #! /usr/bin/env python3 #! -*- encoding: utf-8 -*- def test(x,y): xint x yint y cxy return c if _name_"__main__": print(test(2…

當MCP撞進云宇宙:多芯片封裝如何重構云計算的“芯“未來?

當MCP撞進云宇宙:多芯片封裝如何重構云計算的"芯"未來? 2024年3月,AMD發布了震撼業界的MI300A/B芯片——這顆為AI計算而生的"超級芯片",首次在單封裝內集成了13個計算芯片(包括3D V-Cache緩存、CDNA3 GPU和Zen4 CPU),用多芯片封裝(Multi-Chip Pac…

用定時器做微妙延時注意事項

注意定時器來著APB1還是APB2&#xff0c;二者頻率不一樣&#xff0c;配置PSC要注意 &#xff08;1&#xff09;高級定時器timer1&#xff0c; timer8以及通用定時器timer9&#xff0c; timer10&#xff0c; timer11的時鐘來源是APB2總線 &#xff08;2&#xff09;通用定時器ti…

三類思維坐標空間與時空序位信息處理架構

三類思維坐標空間與時空序位信息處理架構 一、靜態信息元子與元組的數據結構設計 三維思維坐標空間定義 形象思維軸&#xff08;x&#xff09;&#xff1a;存儲多媒體數據元子&#xff08;圖像/音頻/視頻片段&#xff09; 元子結構&#xff1a;{ID, 數據塊, 特征向量, 語義…

spring boot中@Validated

在 Spring Boot 中&#xff0c;Validated 是用于觸發參數校驗的注解&#xff0c;通常與 ??JSR-303/JSR-380??&#xff08;Bean Validation&#xff09;提供的校驗注解一起使用。以下是常見的校驗注解及其用法&#xff1a; ?1. 基本校驗注解?? 這些注解可以直接用于字段…

Hadoop 單機模式(Standalone Mode)部署與 WordCount 測試

通過本次實驗&#xff0c;成功搭建了 Hadoop 單機環境并運行了基礎 MapReduce 程序&#xff0c;為后續分布式計算學習奠定了基礎。 掌握 Hadoop 單機模式的安裝與配置方法。 熟悉 Hadoop 環境變量的配置及 Java 依賴管理。 使用 Hadoop 自帶的 WordCount 示例程序進行簡單的 …

歷史數據分析——運輸服務

運輸服務板塊簡介: 運輸服務板塊主要是為貨物與人員流動提供核心服務的企業的集合,涵蓋鐵路、公路、航空、海運、物流等細分領域。該板塊具有強周期屬性,與經濟復蘇、政策調控、供需關系密切關聯,尤其是海運領域。有不少國內股市的鐵路、公路等相關的上市公司同時屬于紅利…

openEuler 22.03 安裝 Mysql 5.7,TAR離線安裝

目錄 一、檢查系統是否安裝其他版本Mariadb數據庫二、環境檢查2.1 必要環境檢查2.2 在線安裝&#xff08;有網絡&#xff09;2.3 離線安裝&#xff08;無網絡&#xff09; 三、下載Mysql2.1 在線下載2.2 離線下載 四、安裝Mysql五、配置Mysql六、開放防火墻端口七、數據備份八、…

噴泉碼技術在現代物聯網中的應用 設計

噴泉碼技術在現代物聯網中的應用 摘 要 噴泉碼作為一種無速率編碼技術,憑借其動態生成編碼包的特性,在物聯網通信中展現出獨特的優勢。其核心思想在于接收端只需接收到足夠數量的任意編碼包即可恢復原始數據,這種特性使其特別適用于動態信道和多用戶場景。噴泉碼的實現主要…

GZIPInputStream 類詳解

GZIPInputStream 類詳解 GZIPInputStream 是 Java 中用于解壓縮 GZIP 格式數據的流類,屬于 java.util.zip 包。它是 InflaterInputStream 的子類,專門處理 GZIP 壓縮格式(.gz 文件)。 1. 核心功能 解壓 GZIP 格式數據(RFC 1952 標準)自動處理 GZIP 頭尾信息(校驗和、時…

網絡編程——TCP和UDP詳細講解

文章目錄 TCP/UDP全面詳解什么是TCP和UDP&#xff1f;TCP如何保證可靠性&#xff1f;1. 序列號&#xff08;Sequence Number&#xff09;2. 確認應答&#xff08;ACK&#xff09;3. 超時重傳&#xff08;Timeout Retransmission&#xff09;4. 窗口控制&#xff08;Sliding Win…