14-2(C++11)類型推導、類型計算

14-2(C++11)類型推導、類型計算

  • 類型推導
    • auto關鍵字
    • auto類型推斷本質
    • auto與引用 聯用
    • auto關鍵字的使用限制
  • 類型計算
    • 類型計算分類
    • 與類型推導相比
    • 四種類型計算的規則
    • 返回值后置

類型推導

auto關鍵字

  • C++98中,auto表示棧變量,通常省略不寫
  • C++11中,給auto賦予新的語義,表示自動類型推導
    • 既根據對變量進行初始化時所使用的數據的類型,由編譯器自動推導出所定義變量的實際類型
      在這里插入圖片描述

auto類型推斷本質

  • 按照定義獨立對象并根據初始化數據的類型進行推導
  • 無法自動推斷 const,只能在auto的上下文顯示指明
  • 如果給出的 初始化數據類型為常量指針,則可以自動推導const
// 類型推導不是類型照抄
#include <iostream>
#include <typeinfo>
using namespace std;int main( void ){int a = 10;const int b = 10;auto c = a;// auto: int      c: intcout << "c的類型:" << typeid(c).name() << endl; // icout << "&c: " << &c << ", &a: " << &a << endl; // 地址不同c++; // 允許更改auto d = b;// auto: int      d: intcout << "d的類型:" << typeid(d).name() << endl; // icout << "&d: " << &d << ", &b: " << &b << endl; // 地址不同d++; // 允許更改const auto e = b;// auto: int      e: const intcout << "e的類型:" << typeid(e).name() << endl; // icout << "&e: " << &e << ", &b: " << &b << endl; // 地址不同
//  e++; // 不允許更改auto f = &b; // 如果初始化數據的類型是常量指針,則可以自動推導const(第一種可以自動推導const的情況)// auto: const int*      f: const int*cout << "f的類型:" << typeid(f).name() << endl; // PKi 
//  *f = 666;f = NULL;return 0;
} 

auto與引用 聯用

  • 按照定義獨立對象并根據初始化數據的類型進行推導,所以不可能推導出引用
  • 除非auto的上下文指明按照引用推導
  • 若指明按引用推導并且目標帶有常屬性,則可以自動推導const
// 類型推導和引用聯用
#include <iostream>
#include <typeinfo>
using namespace std;int main( void ){int a = 10;const int b = 10;auto c = a;// auto: int      c: intcout << "c的類型:" << typeid(c).name() << endl; // icout << "&c: " << &c << ", &a: " << &a << endl; // 地址不同c++; // 允許更改auto& d = a;// auto: int  d: int&cout << "d的類型:" << typeid(d).name() << endl; // icout << "&d: " << &d << ", &a: " << &a << endl; // 地址相同d++; // 允許更改auto& e = b; // 如果指明按引用推導,并且目標帶有常屬性,則也可以自動推導出const(這是第二種自動推導出const的情況)// auto: const int   e: const int&cout << "e的類型:" << typeid(e).name() << endl; // icout << "&e: " << &e << ", &b: " << &b << endl; // 地址相同
//  e++; // 不允許更改return 0; 
} 

auto關鍵字的使用限制

  • 函數形參類型無法推導(C++14標準支持)
  • 類的成員變量無法推導
// 類型推導的局限性
#include <iostream>
#include <typeinfo>
using namespace std;
/*
void foo(auto v){// ...
}
*/
/*
class A{
public:auto a; // 聲明auto b; // 聲明
};
*/int main( void ){
//  foo(10);
//  foo(3.14);return 0; 
} 

類型計算

類型計算分類

  • C語言: sizeof - 計算類型的大小
  • C++語言: typeid - 可以獲取類型的信息字符串
  • C++11: decltype - 獲取參數表達式的類型

注意事項:類型計算由編譯器確定,并不是運行期確定

與類型推導相比

  • 對類型的確定更加精準
const int a = 10;
auto b = a; // b類型推導為int
decltype(a) c = a; //c類型計算為 const int
  • 可以做到類型相同但值不同
const int a = 10:
auto b=a;
decltype(a) c = 100;
// 類型推導和類型計算的比較
#include <iostream>
#include <typeinfo>
using namespace std;int main( void ){const int a = 10;auto b = a;// auto : int  b : intcout << "b的類型:" << typeid(b).name() << endl; // icout << "&b: " << &b << ", &a:" << &a << endl; // 地址不同b++; // 允許更改// 類型計算比類型推導在類型的確定上會更加精準decltype(a) c = 666;// = a;// c: const intcout << "c的類型:" << typeid(c).name() << endl; // i cout << "&c: " << &c << ", &a:" << &a << endl; // 地址不同
//  c++; // 不允許更改return 0; 
} 

四種類型計算的規則

  • 標識符表達式,直接取表達式的類型
  • 函數表達式,取函數返回值的類型
  • 其他表達式
    • 如果表達式的值為左值,則取左值引用的類型
    • 如果表達式的值為右值,則取該右值本身的類型
// 四種類型計算的規則
#include <iostream>
#include <typeinfo>
using namespace std;double foo();int main( void ){int a = 10;// 如果給decltype傳遞的是標識符表達式,則編譯器根據標識符的類型,作為最終計算出的類型decltype(a) c = a;// c: intcout << "c的類型:" << typeid(c).name() << endl; // icout << "&c:" << &c << ", &a:" << &a << endl; // 地址不同c++; // 允許更改// 如果給decltype傳遞的是函數表達式,則編譯器根據函數的返回值的類型,作為最終計算出的類型decltype(foo()) d = a;// d: doublecout << "d的類型:" << typeid(d).name() << endl; // dcout << "&d:" << &d << ", &a:" << &a << endl; // 地址不同d++; // 允許更改// 如果是其它表達式,并且表達式結果為左值,則編譯器取該左值引用的類型,作為最終計算出的類型decltype(++a) e  = a;// e: int&cout << "e的類型:" << typeid(e).name() << endl; // icout << "&e:" << &e << ", &a:" << &a << endl; // 地址相同e++; // 允許更改// 如果是其它表達式,并且表達式結果為右值,則編譯器取該右值本身的類型,做為最終計算出的類型decltype(a++) f = a;// f: intcout << "f的類型:" << typeid(f).name() << endl; // icout << "&f:" << &f << ", &a:" << &a << endl; // 地址不同f++; // 允許更改 return 0; 
} 

返回值后置

auto 函數名 (形參表) ->decltype(表達式)

#include <iostream>
#include <typeinfo>
using namespace std;auto foo(int x, double y) -> decltype(x+y){return x + y;
}int main( void ){auto f = foo(3,3.14);cout << "f的類型:" << typeid(f).name() << endl;return 0; 
} 

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

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

相關文章

Leetcode刷題筆記題解(C++):25. K 個一組翻轉鏈表

思路&#xff1a;利用棧的特性&#xff0c;K個節點壓入棧中依次彈出組成新的鏈表&#xff0c;不夠K個節點則保持不變 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在國內,現在月薪1萬是什么水平?

看到網友發帖問&#xff1a;現在月薪1W是什么水平&#xff1f; 在現如今的情況下&#xff0c;似乎月薪過萬這個標準已經成為衡量個人能力的一個標準了&#xff0c;尤其是現在互聯網橫行的時代&#xff0c;好像年入百萬&#xff0c;年入千萬就應該是屬于大眾的平均水平。 我不是…

kafka入門(四):消費者

消費者 (Consumer ) 消費者 訂閱 Kafka 中的主題 (Topic) &#xff0c;并 拉取消息。 消費者群組&#xff08; Consumer Group&#xff09; 每一個消費者都有一個對應的 消費者群組。 一個群組里的消費者訂閱的是同一個主題&#xff0c;每個消費者接收主題的一部分分區的消息…

大師學SwiftUI第18章Part2 - 存儲圖片和自定義相機

存儲圖片 在前面的示例中&#xff0c;我們在屏幕上展示了圖片&#xff0c;但也可以將其存儲到文件或數據庫中。另外有時使用相機將照片存儲到設備的相冊薄里會很有用&#xff0c;這樣可供其它應用訪問。UIKit框架提供了如下兩個保存圖片和視頻的函數。 UIImageWriteToSavedPh…

JAVA后端自學技能實操合集

JAVA后端自學技能實操 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習FastDFS使用docker安裝FastDFS(linux)集成到springboot項目中 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習 FastDFS 組名&#xff1a;文件上傳后所在的 st…

leetcode 100.相同的樹

涉及到遞歸&#xff0c;最好多畫圖理解&#xff0c;希望對你們有幫助 100.相同的樹 題目 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 題目鏈接…

GPIO的使用--滴答定時器--pir人體紅外傳感器

目錄 一、滴答定時器的使用與原理 1、定義 2、原理 &#xff08;1&#xff09;向上計數?編輯 &#xff08;2&#xff09;向下計數 &#xff08;3&#xff09; 代碼流程 a、配置滴答時鐘喚醒頻率 b、滴答時鐘中斷函數 &#xff08;4&#xff09;結果 3、優化-->寄存…

Proxy Hook Trace JSON

Proxy var window {key: "qww",age: 22 } window new Proxy(window, {get(target, p, receiver) {console.log("target: ", target);console.log("p: ", p);// return window[username];/// 這里如果這樣寫. 有遞歸風險的...// return Reflec…

【線性代數與矩陣論】Jordan型矩陣

Jordan型矩陣 2023年11月3日 #algebra 文章目錄 Jordan型矩陣1. 代數重數與幾何重數2. Jordan塊與Jordan標準型2.1 最小多項式與Jordan標準型2.2 兩類重要矩陣 3. 矩陣的Jordan分解3.1 Jordan分解的應用 下鏈 1. 代數重數與幾何重數 在對向量做線性變換時&#xff0c;向量空間…

讀書筆記-《數據結構與算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通過構建有序序列&#xff0c;對于未排序序列&#xff0c;在已排序序列中從后向前掃描(對于單向鏈表則只能從前往后遍歷)&#xff0c;找到相應位置并插入。實現上通常使用in-place排序(需用到O(1)的額外空間) 從第一個元素開始&#xff0c;該元素可…

如何主持一場知識競賽搶答賽

知識競賽主持說難不難&#xff0c;說簡單也不簡單&#xff0c;我就從易到難介紹一下。 入門級&#xff0c;題主不用練習太多其他花哨的技巧&#xff0c;只要注意一點&#xff0c;熟悉比賽流程。知識競賽需要給所有選手一個公平流暢的答題環境&#xff0c;所以題主自身必須非常…

干貨!接口中的大事務,該如何進行優化?

作為后端開發的程序員&#xff0c;我們常常會的一些相對比較復雜的邏輯&#xff0c;比如我們需要給前端寫一個調用的接口&#xff0c;這個接口需要進行相對比較復雜的業務邏輯操作&#xff0c;比如會進行&#xff0c;查詢、遠程接口或本地接口調用、更新、插入、計算等一些邏輯…

掌握iText:輕松處理PDF文檔-進階篇

簡體中文寫入 iText本身對簡體中文的支持有限&#xff0c;但可以通過引入額外的字體包來增強其對簡體中文的支持。例如&#xff0c;可以使用iTextAsian.jar這個亞洲字體包&#xff0c;它包含了幾種簡單的亞洲字體&#xff0c;其中包括簡體中文字體。只需要將iTextAsian.jar放到…

springboot 啟動之后報錯:Unsatisfied dependency through field ‘bbbClient’

springboot 啟動之后報錯&#xff1a;UnsatisfiedDepencyException:Error creating bean with name ‘aaaServiceImpl’: Unsatisfied dependency through field ‘bbbClient’。 這兩天一直在進行著日常 debugger 查看代碼。可是發生了一個挺“靈異”的事件。那就是我看的項目…

46. 全排列

46. 全排列 原題鏈接&#xff1a;完成情況&#xff1a;解題思路&#xff1a;參考代碼&#xff1a;_46全排列_構建數組回溯_46全排列_直接構建 錯誤經驗吸取 原題鏈接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情況&#xff1a;…

codeforces D.In Love

思路 用兩個 m u l t i s e t multiset multiset 分別存 l , r l,r l,r 。你也可以寫平衡樹在 l l l 的 m u l t i s e t multiset multiset 里去查詢是否存在比最小的 r r r 大的 l l l 。 Think Twice, Code Once #include<bits/stdc.h> #define il inline #d…

小模型學習(1)-人臉識別

【寫作背景】因為最近一直在研究大模型&#xff0c;在與客戶進行交流時&#xff0c;如果要將大模型的變革性能力講清楚&#xff0c;就一定要能將AI小模型的一些原理和效果講清楚&#xff0c;進而形成對比。當然這不是一件簡單的事情&#xff0c;一方面大模型分析問題的的本質原…

Mybatis分頁插件PageHelper

PageHelper是什么&#xff1f; 是MyBatis提供的分頁插件&#xff0c;可以支持MySQL、Oracle等六種數據庫。 集成方式如下&#xff1a; 1 引入依賴 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> <dependency><groupId>co…

反射加載SDK完成統一調用

文章目錄 1、需求背景2、接口抽象類具體實現類3、疑問4、存在的問題5、通過反射加載SDK并完成調用5、補充&#xff1a;關于業務網關7、補充&#xff1a;關于SDK的開發 關鍵點&#xff1a; 接口抽象類&#xff08;半抽象半實現&#xff09;具體實現類業務網關反射加載SDK&#…

JAVA如何調用python

以下代碼想通過測試&#xff0c;必須有一個前提&#xff1a;電腦上安裝了Python環境。不太習慣說廢話&#xff0c;直接上代碼了。 以下是用于測試的python代碼&#xff08;mytest.py&#xff09;&#xff1a; # 因為用戶到了參數處理&#xff0c;所以需要引用 import argpars…