欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11如何引入的尾置返回類型

 更新時間:2023年01月10日 10:53:26   作者:smart_cat  
C++11 標(biāo)準(zhǔn)引入的尾置返回類型,可以讓返回復(fù)雜類型的函數(shù)聲明更加清晰易讀,在無法使用C++14 標(biāo)準(zhǔn)的情況下,通過尾置返回類型的語法來推導(dǎo)函數(shù)模板的返回類型無疑是最簡便的方法,這篇文章主要介紹了C++11引入的尾置返回類型,需要的朋友可以參考下

一、什么是尾置返回類型(trailing return type)

我們先來看一下傳統(tǒng)的函數(shù)是怎么定義的:

int foo()
{
    return 0;
}

C++11 標(biāo)準(zhǔn)中引入了尾置返回類型后,上述函數(shù)也可定義為:

auto foo() -> int
{
    return 0;
}

其中 auto 是一個占位符,函數(shù)名后 -> 緊跟的 int 才是真正的返回類型。

當(dāng)然了,在這個例子中傳統(tǒng)的函數(shù)聲明方式顯然是更加簡潔的,而當(dāng)返回類型比較復(fù)雜的時候,返回類型后置可能會是一個不錯的選擇。任何函數(shù)的定義都能使用尾置返回。

二、尾置返回的典型場景

2.1 常規(guī)方式如何返回數(shù)組指針

首先來看一下如何返回數(shù)組指針。

因為數(shù)組不能被拷貝,所以函數(shù)不能返回數(shù)組。不過,函數(shù)可以返回數(shù)組的指針或應(yīng)用。雖然從語法上來說,想要定義一個返回數(shù)組的指針或引用的函數(shù)比較繁瑣,但是有一些方法可以簡化這一任務(wù),其中最直接的方法是使用類型別名。

typedef int arrT[10];   // arrT 是一個類型別名,它表示的類型是含有10個整數(shù)的數(shù)組
using arrT = int[10];   // arrT 的等價聲明
arrT* func(int i);      // func 返回一個指向含有10個整數(shù)的數(shù)組的指針

其中 arrT 是含有10個整數(shù)的數(shù)組的別名。因為我們無法返回數(shù)組,所以將返回類型定義成數(shù)組的指針。因此,func 函數(shù)接收一個int實參,返回一個指向包含10個整數(shù)的數(shù)組的指針。

要想在聲明 func 時不使用類型別名,我們必須牢記被定義的名字后面數(shù)組的維度:

int arr[10];        // arr 是一個含有10個整數(shù)的數(shù)組
int *p1[10];        // p1 是一個含有10個指針的數(shù)組
int (*p2)[10];      // p2 是一個指針,它指向含有10個整數(shù)的數(shù)組

和這些聲明一樣,如果想定義一個返回數(shù)組指針的函數(shù),則數(shù)組的維度必須跟在函數(shù)名字之后。然而,函數(shù)的形參列表也跟在函數(shù)名字后面且形參列表應(yīng)該先于數(shù)組的維度。因此,返回數(shù)組指針的函數(shù)形式如下所示:

int arr[10];        // arr 是一個含有10個整數(shù)的數(shù)組
int *p1[10];        // p1 是一個含有10個指針的數(shù)組
int (*p2)[10];      // p2 是一個指針,它指向含有10個整數(shù)的數(shù)組

Type 表示元素類型,dimension 表示數(shù)組的大小。(*function(parameter_list))兩端的括號必須存在,如果沒有這對括號,函數(shù)的返回類型將是指針的數(shù)組。

示例如下:

Type (*function(parameter_list))[dimension]

可以按照如下的順序來逐層理解該聲明的含義:

  • func(int i) 表示調(diào)用 func 函數(shù)時需要一個 int 類型的實參
  • (*func(int i)) 意味著我們可以對函數(shù)調(diào)用的結(jié)果執(zhí)行解引用操作
  • (*func(int i))[10] 表示解引用 func 的調(diào)用將得到一個大小是10的數(shù)組
  • int (*func(int i))[10] 表示數(shù)組中的元素是 int 類型

2.2 使用尾置返回類型

上述傳統(tǒng)的定義形式如果不能很好的理解的話,非常容易搞錯,我們再來看看使用尾置返回類型如何定義:

int (*func(int i))[10];

當(dāng)我們把函數(shù)的返回類型放在了形參列表之后,就可以很清楚地看到func函數(shù)返回的是一個指針,并且該指針指向了含有10個整數(shù)的數(shù)組。

三、尾置返回類型的應(yīng)用

C++11 標(biāo)準(zhǔn)中位置返回類型的作用之一就是推導(dǎo)函數(shù)模板的返回類型,當(dāng)然了前提是需要用到decltype說明符,例如:

#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;
}

20230109221937

四、總結(jié)

C++11 標(biāo)準(zhǔn)引入的尾置返回類型,可以讓返回復(fù)雜類型的函數(shù)聲明更加清晰易讀。在無法使用C++14 標(biāo)準(zhǔn)的情況下,通過尾置返回類型的語法來推導(dǎo)函數(shù)模板的返回類型無疑是最簡便的方法。

注意,在引入C++14 標(biāo)準(zhǔn)后,C++14 標(biāo)準(zhǔn)支持對返回類型聲明為auto的推導(dǎo)。

參考文獻:

《C++ Primer第五版》

《現(xiàn)代C++語言核心特性解析》

到此這篇關(guān)于C++11引入的尾置返回類型的文章就介紹到這了,更多相關(guān)C++11尾置返回類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV如何提取圖片中曲線

    OpenCV如何提取圖片中曲線

    這篇文章主要為大家詳細介紹了OpenCV如何提取圖片中曲線,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實現(xiàn)二叉樹及堆的示例代碼

    C++實現(xiàn)二叉樹及堆的示例代碼

    這篇文章主要介紹了C++實現(xiàn)二叉樹及堆的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語言實現(xiàn)個稅計算器

    C語言實現(xiàn)個稅計算器

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)個稅計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++ getcwd函數(shù)獲取項目運行路徑方法詳解

    C++ getcwd函數(shù)獲取項目運行路徑方法詳解

    在Linux下做QT項目時,需要獲取項目的運行路徑,于是用getcwd函數(shù)進行獲取,然后在Windows下進行測試,發(fā)現(xiàn)獲取到的是程序的項目路徑,即代碼文件路徑,然后再Linux QT中測試,獲取到的又是運行路徑,這就很納悶了。經(jīng)過再三測試,終于發(fā)現(xiàn)了原因
    2022-10-10
  • OpenCV使用鼠標(biāo)響應(yīng)裁剪圖像

    OpenCV使用鼠標(biāo)響應(yīng)裁剪圖像

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)鼠標(biāo)響應(yīng)裁剪圖像,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 一起來練習(xí)C++的指針

    一起來練習(xí)C++的指針

    這篇文章主要為大家詳細介紹了C++的指針,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Windows環(huán)境給FFmpeg集成AVS3解碼器

    Windows環(huán)境給FFmpeg集成AVS3解碼器

    libuavs3d是AVS3標(biāo)準(zhǔn)的解碼器,支持windows/linux/arm/ios等所有常用平臺,在移動端最高支持4K/30fps視頻實時解碼,解碼速度大幅領(lǐng)先AV1開源解碼器dav1d和aomdec,由于FFmpeg默認未啟用libuavs3d,因此需要重新配置FFmpeg,標(biāo)明啟用libuavs3d,然后重新編譯安裝FFmpeg
    2024-05-05
  • 基于C語言的庫封裝發(fā)布技術(shù)詳解

    基于C語言的庫封裝發(fā)布技術(shù)詳解

    在編程的過程中,使用已經(jīng)封裝好的庫函數(shù)是十分方便的,也是十分高效的,這篇文章主要給大家介紹了關(guān)于C語言庫的封裝和使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • c語言snprintf函數(shù)的用法詳解

    c語言snprintf函數(shù)的用法詳解

    這篇文章主要給大家介紹了關(guān)于c語言snprintf函數(shù)用法的相關(guān)資料,snprintf()函數(shù)用于將格式化的數(shù)據(jù)寫入字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • 在Linux下編譯C或C++程序的教程

    在Linux下編譯C或C++程序的教程

    這篇文章主要介紹了在Linux下編譯C或C++程序的教程,是C/C++入門學(xué)習(xí)中的必備知識,需要的朋友可以參考下
    2015-07-07

最新評論