C++11如何引入的尾置返回類(lèi)型
一、什么是尾置返回類(lèi)型(trailing return type)
我們先來(lái)看一下傳統(tǒng)的函數(shù)是怎么定義的:
int foo() { return 0; }
C++11 標(biāo)準(zhǔn)中引入了尾置返回類(lèi)型后,上述函數(shù)也可定義為:
auto foo() -> int { return 0; }
其中 auto 是一個(gè)占位符,函數(shù)名后 -> 緊跟的 int 才是真正的返回類(lèi)型。
當(dāng)然了,在這個(gè)例子中傳統(tǒng)的函數(shù)聲明方式顯然是更加簡(jiǎn)潔的,而當(dāng)返回類(lèi)型比較復(fù)雜的時(shí)候,返回類(lèi)型后置可能會(huì)是一個(gè)不錯(cuò)的選擇。任何函數(shù)的定義都能使用尾置返回。
二、尾置返回的典型場(chǎng)景
2.1 常規(guī)方式如何返回?cái)?shù)組指針
首先來(lái)看一下如何返回?cái)?shù)組指針。
因?yàn)閿?shù)組不能被拷貝,所以函數(shù)不能返回?cái)?shù)組。不過(guò),函數(shù)可以返回?cái)?shù)組的指針或應(yīng)用。雖然從語(yǔ)法上來(lái)說(shuō),想要定義一個(gè)返回?cái)?shù)組的指針或引用的函數(shù)比較繁瑣,但是有一些方法可以簡(jiǎn)化這一任務(wù),其中最直接的方法是使用類(lèi)型別名。
typedef int arrT[10]; // arrT 是一個(gè)類(lèi)型別名,它表示的類(lèi)型是含有10個(gè)整數(shù)的數(shù)組 using arrT = int[10]; // arrT 的等價(jià)聲明 arrT* func(int i); // func 返回一個(gè)指向含有10個(gè)整數(shù)的數(shù)組的指針
其中 arrT 是含有10個(gè)整數(shù)的數(shù)組的別名。因?yàn)槲覀儫o(wú)法返回?cái)?shù)組,所以將返回類(lèi)型定義成數(shù)組的指針。因此,func 函數(shù)接收一個(gè)int實(shí)參,返回一個(gè)指向包含10個(gè)整數(shù)的數(shù)組的指針。
要想在聲明 func 時(shí)不使用類(lèi)型別名,我們必須牢記被定義的名字后面數(shù)組的維度:
int arr[10]; // arr 是一個(gè)含有10個(gè)整數(shù)的數(shù)組 int *p1[10]; // p1 是一個(gè)含有10個(gè)指針的數(shù)組 int (*p2)[10]; // p2 是一個(gè)指針,它指向含有10個(gè)整數(shù)的數(shù)組
和這些聲明一樣,如果想定義一個(gè)返回?cái)?shù)組指針的函數(shù),則數(shù)組的維度必須跟在函數(shù)名字之后。然而,函數(shù)的形參列表也跟在函數(shù)名字后面且形參列表應(yīng)該先于數(shù)組的維度。因此,返回?cái)?shù)組指針的函數(shù)形式如下所示:
int arr[10]; // arr 是一個(gè)含有10個(gè)整數(shù)的數(shù)組 int *p1[10]; // p1 是一個(gè)含有10個(gè)指針的數(shù)組 int (*p2)[10]; // p2 是一個(gè)指針,它指向含有10個(gè)整數(shù)的數(shù)組
Type 表示元素類(lèi)型,dimension 表示數(shù)組的大小。(*function(parameter_list))兩端的括號(hào)必須存在,如果沒(méi)有這對(duì)括號(hào),函數(shù)的返回類(lèi)型將是指針的數(shù)組。
示例如下:
Type (*function(parameter_list))[dimension]
可以按照如下的順序來(lái)逐層理解該聲明的含義:
- func(int i) 表示調(diào)用 func 函數(shù)時(shí)需要一個(gè) int 類(lèi)型的實(shí)參
- (*func(int i)) 意味著我們可以對(duì)函數(shù)調(diào)用的結(jié)果執(zhí)行解引用操作
- (*func(int i))[10] 表示解引用 func 的調(diào)用將得到一個(gè)大小是10的數(shù)組
- int (*func(int i))[10] 表示數(shù)組中的元素是 int 類(lèi)型
2.2 使用尾置返回類(lèi)型
上述傳統(tǒng)的定義形式如果不能很好的理解的話,非常容易搞錯(cuò),我們?cè)賮?lái)看看使用尾置返回類(lèi)型如何定義:
int (*func(int i))[10];
當(dāng)我們把函數(shù)的返回類(lèi)型放在了形參列表之后,就可以很清楚地看到func函數(shù)返回的是一個(gè)指針,并且該指針指向了含有10個(gè)整數(shù)的數(shù)組。
三、尾置返回類(lèi)型的應(yīng)用
C++11 標(biāo)準(zhǔn)中位置返回類(lèi)型的作用之一就是推導(dǎo)函數(shù)模板的返回類(lèi)型,當(dāng)然了前提是需要用到decltype說(shuō)明符,例如:
#include <iostream> using namespace std; template<class T1, class T2> auto sum(T1 t1, T2 t2) -> decltype(t1 + t2) { return t1 + t2; } int main() { auto s1 = sum(2, 3); cout << "sum(2, 3)=" << s1 << endl; cout << "s1 type: " << typeid(s1).name() << endl; auto s2 = sum(2.0, 3.0); cout << "sum(2.0, 3.0)=" << s2 << endl; cout << "s2 type: " << typeid(s2).name() << endl; return 0; }
四、總結(jié)
C++11 標(biāo)準(zhǔn)引入的尾置返回類(lèi)型,可以讓返回復(fù)雜類(lèi)型的函數(shù)聲明更加清晰易讀。在無(wú)法使用C++14 標(biāo)準(zhǔn)的情況下,通過(guò)尾置返回類(lèi)型的語(yǔ)法來(lái)推導(dǎo)函數(shù)模板的返回類(lèi)型無(wú)疑是最簡(jiǎn)便的方法。
注意,在引入C++14 標(biāo)準(zhǔn)后,C++14 標(biāo)準(zhǔn)支持對(duì)返回類(lèi)型聲明為auto的推導(dǎo)。
參考文獻(xiàn):
《C++ Primer第五版》
《現(xiàn)代C++語(yǔ)言核心特性解析》
到此這篇關(guān)于C++11引入的尾置返回類(lèi)型的文章就介紹到這了,更多相關(guān)C++11尾置返回類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)二叉樹(shù)及堆的示例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)二叉樹(shù)及堆的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04C語(yǔ)言實(shí)現(xiàn)個(gè)稅計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)個(gè)稅計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C++ getcwd函數(shù)獲取項(xiàng)目運(yùn)行路徑方法詳解
在Linux下做QT項(xiàng)目時(shí),需要獲取項(xiàng)目的運(yùn)行路徑,于是用getcwd函數(shù)進(jìn)行獲取,然后在Windows下進(jìn)行測(cè)試,發(fā)現(xiàn)獲取到的是程序的項(xiàng)目路徑,即代碼文件路徑,然后再Linux QT中測(cè)試,獲取到的又是運(yùn)行路徑,這就很納悶了。經(jīng)過(guò)再三測(cè)試,終于發(fā)現(xiàn)了原因2022-10-10Windows環(huán)境給FFmpeg集成AVS3解碼器
libuavs3d是AVS3標(biāo)準(zhǔn)的解碼器,支持windows/linux/arm/ios等所有常用平臺(tái),在移動(dòng)端最高支持4K/30fps視頻實(shí)時(shí)解碼,解碼速度大幅領(lǐng)先AV1開(kāi)源解碼器dav1d和aomdec,由于FFmpeg默認(rèn)未啟用libuavs3d,因此需要重新配置FFmpeg,標(biāo)明啟用libuavs3d,然后重新編譯安裝FFmpeg2024-05-05基于C語(yǔ)言的庫(kù)封裝發(fā)布技術(shù)詳解
在編程的過(guò)程中,使用已經(jīng)封裝好的庫(kù)函數(shù)是十分方便的,也是十分高效的,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言庫(kù)的封裝和使用的相關(guān)資料,需要的朋友可以參考下2021-08-08