auto關鍵字解析

前言

11標準之前,autoc++中是聲明存儲器類型的關鍵字。而在11標準中它的功能變為了類型推導。

對此, 在這里引入C++primer中的原句:

編程時常常需要把表達式的值賦給變量,這就要求在聲明變量的時候清楚的知道表達式的類型。然而要做到這一點并非那么容易,有時候甚至根本做不到。為了解決這個問題,C++11新標準引入了auto類型說明符,用它就能讓編譯器替我們去分析表達式所屬的類型。和原來的那些對應的一種特定類型的說明符不同,auto讓編譯器通過初始值來推斷變量的類型。顯然,auto定義的變量必須具有初始值。

比如下面的代碼:

?vector<int> vtr{ 0, 1, 2, 3, 4 };for (auto x : vtr)cout << x << ' ';

可以看出auto設計的基本思想就是想通過簡短的auto占位符替代程序中長且雜的各種數據類型。從而增大開發效率。

顯然想要auto實現這一目的需要滿足——auto必須能夠表示出程序中的所有數據類型。

auto的組合使用

auto不僅僅能夠表示單獨的數據類型,還可以和&*等類型標識符配合使用組成其他的數據類型,比如:

?int x = 0;auto *pt1 = &x; // pt1為int*, auto推導為 intauto pt2 = &x; // pt2為int*, auto推導為int*auto& r1 = x; // r1為int&, auto推導為intauto r2 = r1; // r2為int,auto推導為int

指針和引用作為棧區數據的左膀右臂,若只使用auto關鍵字,想要達到將int賦值給引用這種操作顯然是做不到的。

int在賦值給auto時會不明確auto到底是普通類型還是引用類型而產生二義性,為了避免二義性,規定int類型賦值給auto依舊是int類型,若想要賦值給引用類型需要auto&配合使用。

這也與auto表示所有類型的理念不約而和。

autoconst

前面講述和auto在設計時為了避免二義性會進行取舍操作,保證一種聲明賦值語句只會對應一種類型。

但是這樣同樣會衍生一個問題——在避免二義性得時候如何選擇。

假設我們作為C++語言的設計者,在選擇時肯定會更偏向于更自由的一方,畢竟C++的設計理念就是既想保留C的自由,又想發展自己的東西。

接下來我就會列舉幾個autoconst的組合。并從是否合法,涵蓋全面,更自由的選擇等方面來分析編譯器為何會如此選擇。

要補充一點,可能有的時候看似auto有多種選擇,因為在C++中賦值語句是支持隱式類型轉換的,但是實際上auto作為"萬能的數據類型",其在設計時就應當規避掉類型轉換的操作,所以在分析時我不會考慮類型轉換的選擇。

?int x = 0;const auto n = x; // auto會被推導為 intauto f = n; // const在取值時沒有限定,因此編譯器會將auto處理為int,顯然int會比const int涵蓋面更廣?const auto& r1 = x; // auto會被翻譯成int, 當然也有可能會被翻譯成const int, 不過在編譯器中多個const和一個const效果相同?// int& r3 = n; 這樣賦值編譯器會報錯auto& r2 = n; // r2會被翻譯成const int, 因為const int數值是不能賦值給int引用的,所以編譯器選擇const int
  1. const auto n = xxint類型,而auto前面有const限定符,顯然這里的auto只能被推導為int類型。

  2. auto f = n:前面我們分析了nconst int類型,而const int類型允許賦值給const int,和int類型,有兩種選擇,最終選擇int

    主要從兩方面分析,一方面是我們所說的自由性,若想要賦值給const int類型可以在auto前加上const限定符。

    const int無法添加限定符將其變為int類型,所以顯然int要比const int更自由。

    另一方面,如果auto在這里被推導為const int類型,那么你會發現沒有一種情況可以使const int類型賦值給autoauto被推導為int了,這違背了auto的設計理念。

  3. const auto& r1 = x:會被翻譯為int,不多討論。

  4. auto& r2 = nnconst int類型,而在c++中只允許const int類型賦值給const int&類型(這里不是說不能賦值給其他,只是說若要賦值給引用則必須加const限定符),所以這里也只能是const int&

總結

借用C++primer中的一句話:

auto一般會忽略掉頂層const,同時底層const則會保留下來。

比如在a = b這種賦值語句中,盡管bconst限定,但其實a是直接將b中的數據拷貝過來,auto會直接忽略掉const

而在&a = b這種語句中,a實際上是保存的b的地址,auto就會保留下const

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

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

相關文章

嵌入式STM32學習——串口USART 2.0(printf重定義及串口發送)

printf重定義&#xff1a; C語言里面的printf函數默認輸出設備是顯示器&#xff0c;如果要實現printf函數輸出正在串口或者LCD顯示屏上&#xff0c;必須要重定義標準庫函數里調用的與輸出設備相關的函數&#xff0c;比如printf輸出到串口&#xff0c;需要將fputc里面的輸出指向…

信號量機制:操作系統中的同步與互斥利器

在計算機操作系統中&#xff0c;信號量機制是一種重要的進程同步與互斥工具。它廣泛應用于多進程或多線程環境中&#xff0c;用于解決并發訪問共享資源時可能出現的競態條件問題。本文將從信號量的基本概念出發&#xff0c;逐步深入探討其工作原理、實現方式以及實際應用&#…

LeetCode 1004. 最大連續1的個數 III

LeetCode 1004題 “最大連續1的個數 III” 是一道關于數組和滑動窗口的問題。題目描述如下&#xff1a; 題目描述 給定一個由若干 0 和 1 組成的數組 nums&#xff0c;以及一個整數 k。你可以將最多 k 個 0 翻轉為 1。返回經過翻轉操作后&#xff0c;數組中連續 1 的最大個數…

digitalworld.local: FALL靶場

digitalworld.local: FALL 來自 <digitalworld.local: FALL ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.182&#xff0c;靶場IP192.168.23.4 3&…

經典Java面試題的答案——Java 基礎

大家好&#xff0c;我是九神。這是互聯網技術崗的分享專題&#xff0c;廢話少說&#xff0c;進入正題&#xff1a; 1.JDK 和 JRE 有什么區別&#xff1f; JDK&#xff1a;Java Development Kit 的簡稱&#xff0c;java 開發工具包&#xff0c;提供了 java 的開發環境和運行環境…

LabVIEW風機狀態實時監測

在當今電子設備高度集成化的時代&#xff0c;設備散熱成為關鍵問題。許多大型設備機箱常采用多個風機協同散熱&#xff0c;確保系統穩定運行。一旦風機出現故障&#xff0c;若不能及時察覺&#xff0c;可能導致設備損壞&#xff0c;造成巨大損失。為滿足對機箱內風機狀態實時監…

18 C 語言算術、關系、邏輯運算符及 VS Code 警告配置詳解

1 運算符與表達式核心概念 1.1 什么是運算符 運算符是編程和數學中具有特定功能的符號&#xff0c;用于對數據進行運算、賦值、比較及邏輯處理等操作。它們能夠改變、組合或比較操作數的值&#xff0c;進而生成新值或觸發特定動作。 1.2 什么是表達式 表達式是編程和數學中用…

shell腳本之函數詳細解釋及運用

什么是函數 通俗地講&#xff0c;所謂函數就是將一組功能相對獨立的代碼集中起來&#xff0c;形成一個代碼塊&#xff0c;這個代碼可 以完成某個具體的功能。從上面的定義可以看出&#xff0c;Shell中的函數的概念與其他語言的函數的 概念并沒有太大的區別。從本質上講&#…

86.評論日記

再談小米SU7高速爆燃事件_嗶哩嗶哩_bilibili 2025年5月21日14:00:45

Babylon.js學習之路《七、用戶交互:鼠標點擊、拖拽與射線檢測》

文章目錄 1. 引言&#xff1a;用戶交互的核心作用1.1 材質與紋理的核心作用 2. 基礎交互&#xff1a;鼠標與觸摸事件2.1 綁定鼠標點擊事件2.2 觸摸事件適配 3. 射線檢測&#xff08;Ray Casting&#xff09;3.1 射線檢測的原理3.2 高級射線檢測技巧 4. 拖拽物體的實現4.1 拖拽基…

adb抓包

目錄 抓包步驟 步驟 1: 獲取應用的包名 步驟 2: 查看單個應用的日志 步驟 3: 使用日志級別過濾器 步驟 4: 高級日志過濾 可能的原因&#xff1a; 解決方案&#xff1a; 額外提示&#xff1a; 日志保存 抓包步驟 連接設備 adb devices 步驟 1: 獲取應用的包名 首先…

什么是實時流數據?核心概念與應用場景解析

在當今數字經濟時代&#xff0c;實時流數據正成為企業核心競爭力。金融機構需要實時風控系統在欺詐交易發生的瞬間進行攔截&#xff1b;電商平臺需要根據用戶實時行為提供個性化推薦&#xff1b;工業物聯網需要監控設備狀態預防故障。這些場景都要求系統能夠“即時感知、即時分…

百度飛槳OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本識別-Java項目實踐

什么是OCR? OCR&#xff08;Optical Character Recognition&#xff0c;光學字符識別&#xff09;是一種通過技術手段將圖像或掃描件中的文字內容轉換為可編輯、可搜索的文本格式&#xff08;如TXT、Word、PDF等&#xff09;的技術。它廣泛應用于文檔數字化、信息提取、自動化…

Pytorch實現常用代碼筆記

Pytorch實現常用代碼筆記 基礎實現代碼其他代碼示例Networks or ProjectsNetwork ModulesLossUtils 基礎實現代碼 參考 深度學習手寫代碼 其他代碼示例 Networks or Projects SENet學習筆記 SKNet——SENet孿生兄弟篇 GCNet&#xff1a;當Non-local遇見SENet YOLOv1到YOLO…

word通配符表

目錄 一、word查找欄代碼&通配符一覽表二、word替換欄代碼&通配符一覽表三、參考文獻 一、word查找欄代碼&通配符一覽表 序號清除使用通配符復選框勾選使用通配符復選框特殊字符代碼特殊字符代碼or通配符1任意單個字符^?一個任意字符?2任意數字^#任意數字&#…

TYUT-企業級開發教程-第6章

這一章 考點不多 什么是緩存&#xff1f;為什么要設計出緩存&#xff1f; 企業級應用為了避免讀取數據時受限于數據庫的訪問效率而導致整體系統性能偏低&#xff0c;通 常會在應用程序與數據庫之間建立一種臨時的數據存儲機制&#xff0c;該臨時存儲數據的區域稱 為緩存。緩存…

雙檢鎖(Double-Checked Locking)單例模式

在項目中使用雙檢鎖&#xff08;Double-Checked Locking&#xff09;單例模式來管理 JSON 格式化處理對象&#xff08;如 ObjectMapper 在 Jackson 庫中&#xff0c;或 JsonParser 在 Gson 庫中&#xff09;是一種常見的做法。這種模式確保了對象只被創建一次&#xff0c;同時在…

華為網路設備學習-22(路由器OSPF-LSA及特殊詳解)

一、基本概念 OSPF協議的基本概念 OSPF是一種內部網關協議&#xff08;IGP&#xff09;&#xff0c;主要用于在自治系統&#xff08;AS&#xff09;內部使路由器獲得遠端網絡的路由信息。OSPF是一種鏈路狀態路由協議&#xff0c;不直接傳遞路由表&#xff0c;而是通過交換鏈路…

數獨求解器3.0 增加latex格式讀取

首先說明兩種讀入格式 latex輸入格式說明 \documentclass{article} \begin{document}This is some text before oku.\begin{array}{|l|l|l|l|l|l|l|l|l|} \hline & & & & 5 & & 2 & 9 \\ \hline& & 5 & 1 & & 7…

20250520在全志H3平臺的Nano Pi NEO CORE開發板上運行Ubuntu Core16.04.3時跑通4G模塊EC20

1、h3-sd-friendlycore-xenial-4.14-armhf-20210618.img.gz 在WIN10下使用7-ZIP解壓縮/ubuntu20.04下使用tar 2、Win32DiskImager.exe 寫如32GB的TF卡。【以管理員身份運行】 3、TF卡如果已經做過會有3個磁盤分區&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5_WinE…