0. decltype關(guān)鍵字
decltype被稱作類型說明符,它的作用是選擇并返回操作數(shù)的數(shù)據(jù)類型。
// sum的類型就是函數(shù)f返回的類型
decltype(f()) sum = x;
1
2
回想【C++深陷】之“類型與變量”第4節(jié),我們將定義變量的方法規(guī)范為:
類型說明符 聲名符列表
1
decltype就是一種類型說明符,它的出現(xiàn)主要是解決復(fù)雜的類型聲明。
隨著程序越來越復(fù)雜,程序中用到的類型也越來越多,這種復(fù)雜性體現(xiàn)在兩個(gè)方面。
一是一些類型難于“拼寫”,它們的名字既難記又容易寫錯(cuò),還無法明確體現(xiàn)其真實(shí)目的和含義。
二是有時(shí)候根本搞不清到底需要的類型是什么,程序員不得不回過頭去從程序的上下文尋求幫助。
解決問題一,可以使用類型別名技術(shù)。
解決問題二,可以使用auto和本文的主題:decltype。
關(guān)于decltype,需要注意:
工作原理
decltype + 變量 var
decltype + 表達(dá)式 expr
decltype + 函數(shù)名 func_name
1. 工作原理
decltype并不會(huì)實(shí)際計(jì)算表達(dá)式的值,編譯器分析表達(dá)式并得到它的類型。
函數(shù)調(diào)用也算一種表達(dá)式,因此不必?fù)?dān)心在使用decltype時(shí)真正的執(zhí)行了函數(shù),正如前例中的f()。
2. decltype + 變量
根據(jù)【C++深陷】之“表達(dá)式與運(yùn)算符”中關(guān)于表達(dá)式的定義,我們知道單獨(dú)使用一個(gè)變量,相當(dāng)于一個(gè)最簡(jiǎn)單的表達(dá)式。
但是在decltype這里有區(qū)別。
①當(dāng)使用decltype(var)的形式時(shí),decltype會(huì)直接返回變量的類型(包括頂層const和引用),不會(huì)返回變量作為表達(dá)式的類型。
const int ci = 0, &cj = ci;
// x的類型是const int
decltype(ci) x = 0;
// y的類型是const int &
decltype(cj) y = x;
1
2
3
4
5
6
7
decltype加指針也會(huì)返回指針的類型。
decltype加數(shù)組,不負(fù)責(zé)把數(shù)組轉(zhuǎn)換成對(duì)應(yīng)的指針,所以其結(jié)果仍然是個(gè)數(shù)組(P206)。
總之decltype(var)完美保留了變量的類型。
“變量作為表達(dá)式的類型”是什么呢?見下節(jié)。
3. decltype + 表達(dá)式
②當(dāng)使用decltype(expr)的形式時(shí),decltype會(huì)返回表達(dá)式結(jié)果對(duì)應(yīng)的類型。
回想【C++深陷】之“表達(dá)式與運(yùn)算符”,一個(gè)表達(dá)式的結(jié)果不是左值,就是右值。
關(guān)于左值和右值,請(qǐng)參考【C++深陷】之“左值與右值”。
因此,decltype(expr)的結(jié)果根據(jù)expr的結(jié)果不同而不同:expr返回左值,得到該類型的左值引用;expr返回右值,得到該類型。
int i = 42, *p = &i, &r = i;
// r + 0是一個(gè)表達(dá)式
// 算術(shù)表達(dá)式返回右值
// b是一個(gè)int類型
decltype(r + 0) b;
// c是一個(gè)int &
decltype(*p) c = i;
1
2
3
4
5
6
7
8
9
這里注意一下decltype(*p)。
解引用運(yùn)算符*作用于指針類型,得到了p指向的對(duì)象的左值(*p = 2很正確),p是指向int的指針,因此decltype(*p)得到的類型是int &。
再來看第2節(jié)說到的“變量作為表達(dá)式的類型”。
當(dāng)變量作為表達(dá)式時(shí),返回的是該變量的一個(gè)左值形式(因?yàn)樵摫磉_(dá)式的結(jié)果可以作為賦值語(yǔ)句的左側(cè)的值)。因此,使用decltype理應(yīng)得到一個(gè)該類型的左值引用。
但是decltype單獨(dú)作用于對(duì)象,沒有使用對(duì)象的表達(dá)式的屬性,而是直接獲得了變量的類型。
要想獲得變量作為表達(dá)式的類型,可以加一個(gè)括號(hào):
int i = 42;
// 加了括號(hào),變成了表達(dá)式
// 返回的是i的左值形式
// 因此ri的類型是int &
decltype((i)) ri = i;
1
2
3
4
5
6
那么請(qǐng)問,下面的代碼,temp是什么類型:
int i = 42, *p = &i;
decltype((p)) temp = p;
1
2
3
解析:decltype作用的是表達(dá)式,(p)得到的是p的左值,所以temp一定是一個(gè)引用;p是指向int類型的指針,因此decltype得到的是指向int類型的指針的引用。
4. decltype + 函數(shù)
C++中通過函數(shù)的返回值和形參列表,定義了一種名為函數(shù)類型的東西。它的作用主要是為了定義函數(shù)指針。
例如:
// 聲明了一個(gè)函數(shù)類型
using FuncType = int(int &, int);
// 下面的函數(shù)就是上面的類型
int add_to(int &des, int ori);
// 聲明了一個(gè)FuncType類型的指針
// 并使用函數(shù)add_to初始化
FuncType *pf = add_to;
int a = 4;
// 通過函數(shù)指針調(diào)用add_to
pf(a, 2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
我們可以使用decltype獲得函數(shù)add_to的類型:
decltype(add_to) *pf = add_to;
1
這樣的聲明就簡(jiǎn)單多了。
③當(dāng)使用decltype(func_name)的形式時(shí),decltype會(huì)返回對(duì)應(yīng)的函數(shù)類型,不會(huì)自動(dòng)轉(zhuǎn)換成相應(yīng)的函數(shù)指針。
5. 總結(jié)
decltype是為了解決復(fù)雜的類型聲明而使用的關(guān)鍵字,稱作decltype類型說明符。
decltype可以作用于變量、表達(dá)式及函數(shù)名。①作用于變量直接得到變量的類型;②作用于表達(dá)式,結(jié)果是左值的表達(dá)式得到類型的引用,結(jié)果是右值的表達(dá)式得到類型;③作用于函數(shù)名會(huì)得到函數(shù)類型,不會(huì)自動(dòng)轉(zhuǎn)換成指針。
decltype不會(huì)去真的求解表達(dá)式的值,可以放心使用。
————————————————
版權(quán)聲明:本文為博主「Jinxk8」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u014609638/article/details/106987131
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前文章:【C++深陷】之“decltype”-創(chuàng)新互聯(lián)
標(biāo)題URL:http://vcdvsql.cn/article40/ddgsho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)、網(wǎng)站策劃、靜態(tài)網(wǎng)站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容