日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ decltype类型说明符(尾置返回类型使用)

發(fā)布時(shí)間:2023/12/15 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ decltype类型说明符(尾置返回类型使用) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自https://blog.csdn.net/yhl_leo/article/details/50865552

1 基本語(yǔ)法

decltype?類型說(shuō)明符生成指定表達(dá)式的類型。在此過(guò)程中,編譯器分析表達(dá)式并得到它的類型,卻不實(shí)際計(jì)算表達(dá)式的值。

語(yǔ)法為:

decltype( expression )
  • 1

編譯器使用下列規(guī)則來(lái)確定expression?參數(shù)的類型。

  • 如果?expression?參數(shù)是標(biāo)識(shí)符或類成員訪問(wèn),則?decltype(expression)?是?expression?命名的實(shí)體的類型。如果不存在此類實(shí)體或?expression?參數(shù)命名一組重載函數(shù),則編譯器將生成錯(cuò)誤消息。
  • 如果?expression?參數(shù)是對(duì)一個(gè)函數(shù)或一個(gè)重載運(yùn)算符函數(shù)的調(diào)用,則?decltype(expression)?是函數(shù)的返回類型。將忽略重載運(yùn)算符兩邊的括號(hào)。
  • 如果?expression?參數(shù)是右值,則?decltype(expression)?是?expression類型。如果?expression參數(shù)是左值,則?decltype(expression)?是對(duì) 左值引用 類型的expression。

給出如下示例代碼:

int var; const int&& fx(); struct A { double x; } const A* a = new A();
  • 1
  • 2
  • 3
  • 4
語(yǔ)句類型注釋
decltype(fx());const int &&對(duì)左值引用的const int
decltype(var);int變量?var?的類型
decltype(a->x);double成員訪問(wèn)的類型
decltype((a->x));const double&內(nèi)部括號(hào)導(dǎo)致語(yǔ)句作為表達(dá)式而不是成員訪問(wèn)計(jì)算。由于a聲明為?const指針,因此類型是對(duì)const double的引用。

2?decltype和引用

如果decltype使用的表達(dá)式不是一個(gè)變量,則decltype返回表達(dá)式結(jié)果對(duì)應(yīng)的類型。但是有些時(shí)候,一些表達(dá)式向decltype返回一個(gè)引用類型。一般來(lái)說(shuō),當(dāng)這種情形發(fā)生時(shí),意味著該表達(dá)式的結(jié)果對(duì)象能作為一條賦值語(yǔ)句的左值:

// decltype的結(jié)果可以是引用類型 int i = 42, *p = &i, &r = i; decltype(r + 0) b; // OK, 加法的結(jié)果是int,因此b是一個(gè)(未初始化)的int decltype(*p) c; // Error, c是int&, 必須初始化
  • 1
  • 2
  • 3
  • 4

因?yàn)閞是一個(gè)引用,因此decltype(r)的結(jié)果是引用類型,如果想讓結(jié)果類型是r所指的類型,可以把r作為表達(dá)式的一部分,如r+0,顯然這個(gè)表達(dá)式的結(jié)果將是一個(gè)具體的值而非一個(gè)引用。

另一方面,如果表達(dá)式的內(nèi)容是解引用操作,則decltype將得到引用類型。正如我們所熟悉的那樣,解引用指針可以得到指針?biāo)笇?duì)象,而且還能給這個(gè)對(duì)象賦值,因此,decltype(*p)的結(jié)果類型是int&而非int。

3?decltype和auto

  • 處理頂層const和引用的方式不同(參考閱讀:C++ auto類型說(shuō)明符)

如果decltype使用的表達(dá)式是一個(gè)變量,則decltype返回該變量的類型(包括頂層const和引用在內(nèi)):

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; // Error, z是一個(gè)引用,必須初始化
  • 1
  • 2
  • 3
  • 4
  • decltype的結(jié)果類型與表達(dá)式形式密切相關(guān)

對(duì)于decltype所用的引用來(lái)說(shuō),如果變量名加上了一對(duì)括號(hào),則得到的類型與不加括號(hào)時(shí)會(huì)有所不同。如果decltype使用的是一個(gè)不加括號(hào)的變量,則得到的結(jié)果就是該變量的類型;如果給變量加上了一層或多層括號(hào),編譯器就會(huì)把它當(dāng)成是一個(gè)表達(dá)式。

decltype((i)) d; // Error, d是int&, 必須初始化 decltype(i) e; // OK, e是一個(gè)未初始化的int
  • 1
  • 2
  • 模板函數(shù)的返回類型?
    • 在 C++11 中,可以結(jié)合使用尾隨返回類型上的?decltype?類型說(shuō)明符和?auto?關(guān)鍵字來(lái)聲明其返回類型依賴于其模板參數(shù)類型的模板函數(shù)。
    • 在 C++14 中,可以使用不帶尾隨返回類型的?decltype(auto)?來(lái)聲明其返回類型取決于其模板參數(shù)類型的模板函數(shù)。

例如,定義一個(gè)求和模板函數(shù):

//C++11template<typename T, typename U> auto myFunc(T&& t, U&& u) -> decltype (forward<T>(t) + forward<U>(u)) { return forward<T>(t) + forward<U>(u); }; //C++14 template<typename T, typename U> decltype(auto) myFunc(T&& t, U&& u) { return forward<T>(t) + forward<U>(u); };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(forward:如果參數(shù)是右值或右值引用,則有條件地將其參數(shù)強(qiáng)制轉(zhuǎn)換為右值引用。)

附上一段源碼:

#include <iostream> #include <string> #include <utility> #include <iomanip>using namespace std; template<typename T1, typename T2> auto Plus(T1&& t1, T2&& t2) -> decltype(forward<T1>(t1) + forward<T2>(t2)) { return forward<T1>(t1) + forward<T2>(t2); } class X { friend X operator+(const X& x1, const X& x2) { return X(x1.m_data + x2.m_data); } public: X(int data) : m_data(data) {} int Dump() const { return m_data;} private: int m_data; }; int main() { // Integer int i = 4; cout << "Plus(i, 9) = " << Plus(i, 9) << endl; // Floating point float dx = 4.0; float dy = 9.5; cout << setprecision(3) << "Plus(dx, dy) = " << Plus(dx, dy) << endl; // String string hello = "Hello, "; string world = "world!"; cout << Plus(hello, world) << endl; // Custom type X x1(20); X x2(22); X x3 = Plus(x1, x2); cout << "x3.Dump() = " << x3.Dump() << endl; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

運(yùn)行結(jié)果為:

Plus(i, 9) = 13 Plus(dx, dy) = 13.5 Hello, world! x3.Dump() = 42
  • 1
  • 2
  • 3
  • 4

參考資料:

  • Microsoft Developer Network: decltype(C++)
  • C++ Primer(第五版)》 Stanley B. Lippman.

轉(zhuǎn)載于:https://www.cnblogs.com/wangshaowei/p/8865919.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的C++ decltype类型说明符(尾置返回类型使用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久av资源| 一级伦理片 | 日本一级淫片 | 夜色一区| 日本免费网站 | 国产一区二区三区在线播放无 | 夜夜撸小说 | 红桃成人在线 | 手机看片一区 | 色女人网站 | 久久久精品日本 | 少妇av网| 久久黄色片视频 | 久久最新 | 亚洲午夜福利一区二区三区 | 久久久久久久影视 | 欧美一区二区三区久久精品 | 久久亚洲av午夜福利精品一区 | 国产精品suv一区二区三区 | 中文字幕日韩经典 | 美女作爱网站 | 激情xxx | 国产午夜一级一片免费播放 | 成人在线播放av | 国产在线你懂得 | 99久久免费看精品国产一区 | 日韩激情视频在线观看 | 欧美不卡网 | 欧美三级黄色大片 | 亚洲中文字幕一区在线 | 免费一级a毛片 | 久久精品国产亚洲av成人 | 91av日本| 国产精品第七页 | 夜夜夜夜夜操 | 中文字幕成人 | 日本视频一区二区三区 | 欧美特级黄| 中国特级黄色大片 | 一个色综合网 | 国产看片网站 | 97影音| 欧美69久成人做爰视频 | 轮乱| 日本欧美在线视频 | 日韩国产精品久久 | 欧美一区二区三区久久综合 | 黄色在线播放视频 | 日本一本视频 | 亚洲视频播放 | 国产极品在线观看 | 国产真实生活伦对白 | 神马久久久久久久久 | 亚洲88 | 国产成人亚洲一区二区 | 欧美精品亚洲 | 日日夜夜爽 | 亚洲爆乳无码一区二区三区 | 精品福利在线观看 | 精品在线一区二区三区 | 国产中文在线 | 91香蕉国产在线观看软件 | 青青久久av| 日本一区二区三区免费观看 | 欧美一二三区视频 | 日本囗交做爰视频 | 青娱乐导航| 天天操天天撸 | 婷婷欧美 | 日韩综合区 | 99精品视频国产 | 干干天天 | 国产亚洲精品精品精品 | 青青青在线视频观看 | 97视频免费看 | 啪啪福利 | 日韩人妻精品一区二区三区 | 天天摸日日 | 黄色不雅视频 | 福利在线电影 | 涩涩999 | 99久久久无码国产 | 97久久精品 | 一级特黄a | 欧美大片在线 | 亚洲一区二区视频在线播放 | 四虎三级 | 欧美黑人欧美精品刺激 | 91九色视频在线观看 | 88国产精品视频一区二区三区 | 激情内射人妻1区2区3区 | 九九免费精品视频 | 玉蒲团在线 | 日韩少妇一区 | 一区二区视频网站 | 9i看片成人免费看片 | 国产精品91在线观看 | 成人写真福利网 | 久久久久久久综合色一本 |