明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...
類型別名(type alias)一個名字,是某種類型的同義詞。使用類型名有很多好處,能讓復雜的類型名字變得簡單明了,易于理解和使用。
有兩種方法可用于定義類型別名。傳統的方法是使用關鍵字typedef :
typedef double wages; //wages是double的同義詞 typedef wages base, *p; //base是double的同義詞, p是double*的同義詞含有typedef的聲明語句定義的不再是變量而是類型別名。
新標準規定了一種新方法,使用別名聲明(alias declaration)來定義類型的別名:
using SI = Sales_item; //SI是Sales_item的同義詞用關鍵字using作為別名聲明的開始,其后緊跟別名和等號,是作用是吧等號左側的名字規定成等號右側類型的別名。
類型別名和類型的名字等價,只要是類型的名字能出現的地方,就能使用類型別名:
wages hourly, weekly; //等價于double hourly、weekly; SI item; //等價于Sales_item item指針、常量和類型別名
如果摸個類型別名指代的是復合類型或常量,那么把它用到聲明語句里就會產生意想不到的后果。
例如類型pstring,它實際上是類型char*的別名:
typedef char *pstring; const pstring cstr = 0; // cstr是指向char的常量指針 const pstring *ps; //ps是一個指針,它的對象時指向char的常量指針當遇到一條使用了類型別名的聲明語句時,人們往往會錯誤的嘗試把類型別名替換成它本來的樣子,以理解該語句含義:
const char *cstr = 0; //是對const pstring cstr的錯誤理解再次強調這種理解是錯誤的。聲明語句中用到pstring時,其基本數據類型是指針。可是用char*重寫了聲明語句后,數據類型就變成了char,*成為了聲明符的一部分。這樣改寫的結果是,const char成了基本數據類型。前后兩種聲明含義截然不同,前者聲明了一個指向char的常量指針,改寫后的形式則聲明了一個指向const char的指針。
auto 類型說明符
auto讓編譯器通過初始值來推算變量的類型。顯然,auto定義的變量必須有初始值:
//由val1和val2相加的結果可以推斷出item的類型 auto item = val1+val2; //item初始化為val1和val2相加的結果使用auto也能在一條語句中聲明多個變量:
auto i = 0, *p = &i; //正確: i是整數、p是整型指針 auto sz = 0, pi = 3.14; //錯誤:sz和pi的類型不一致復合類型、常量和auto
編譯器一引用對象的類型作為auto的類型:
int i = 0, &r = i; auto a = r; //a是一個整數(r是i的別名,而i是一個整數)其次,autu一般會忽略掉頂層const,同時底層const則會保留下來,比如當初始值是一個指向常量的指針時:
const int ci = i,&cr = ci; auto b = ci; //b是一個整數(ci的頂層const特性被忽略掉了) auto c = cr; //c是一個整數(cr是ci的別名,ci本身是一個頂層const) auto d = &i; //d是一個整型指(整數的地址就是指向整數的指針) auto e = &ci; //e是一個指向整數常量的指針(對常量對象取地址是一種底層const) ci是整數常量如果希望推斷出的auto類型是一個頂層const,需要明確指出:
const auto f = ci; //ci的推演類型是int,f是const int還可以將引用的類型設為auto,此時原來的初始化規則仍然適用:
auto &g = ci; //g是一個整型常量引用,綁定到ci auto &h = 42; //錯誤:不能為非常量引用綁定字面值 const auto &j = 42; //正確:可以為常量引用綁定字面值要在一條語句中定義多個變量,切記,符號&和*指從屬于某個聲明符,而非基本數據類型的一部分,因此初始值必須是同一類型:
auto k = ci, &l = i; //k是整數,l是整型引用 auto &m = ci, *p = &ci; //m是對整型常量的引用,p是指向整型常量的指針//錯誤: i的類型是int而&ci的類型是const int auto &n = i, *p2 = &ci; //如上所說的類型不符 錯誤decltype類型指示符
Decltype它的作用是選擇并返回操作數的數據類型。再次過程中,編譯器分析表達式并得到它的類型,卻不實際計算表達式的值:
decltype(f()) sum = x; //sum的類型就是函數f的返回類型編譯器并不實際調用函數f,而是使用當調用發生時f的返回值類型作為sum的類型。
decltype處理頂層和引用的方式與auto有些許不同。如果decltype使用的表達式是一個變量,則decltype返回該變量的類型(包括頂層和引用在內):
const int ci = 0,&cj = ci; decltype(ci) x = 0; //x的類型是const int decltype(cj) y = x; //y的類型是const int&,y綁定到變量x decltype(cj) z; //錯誤:z是一個引用,必須初始化需要指出的的是,引用從來都是作為其所指對象的同義詞出現,只有用在decltype處是一個例外。
decltype和引用
如果decltype使用的表達式不是一個變量,則decltype返回表達式結果對應的類型。
有些表達式將向decltype返回一個引用類型。一般來說這一維和表達式的結果對象能作為一個賦值語句的左值:
//decltype的結果可以使引用類型 int i = 42, *p = &i, &r = i; decltype(r + 0) b; //正確:加法的結果是int,因此不是一個未初始化的int decltype(*p) c; //錯誤:c是int&,必須初始化因為r是一個引用,因此decltype(r)的結果是引用類型。而r+0顯然結果將是一個具體值而非一個引用。
//decltype的表達式如果是加上了括號的變量,結果將是引用 decltype((i)) d; //錯誤:d是int&,必須初始化 因為加了(), 把它當成表達式 decltype(i) e; //正確:e是一個int切記:decltype((variable))(注意是雙層括號)的結果永遠是引用,而decltype(variable)結果只有當variable本身就是引用時才是引用。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba mysql连接字符串_分享一个V
- 下一篇: eplan如何导入access_EPLA