亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ decltype類型說明符

2020-05-23 14:07:18
字體:
來源:轉載
供稿:網友
在C++中,decltype作為操作符,用于查詢表達式的數據類型。decltype在C++11標準制定時引入,主要是為泛型編程而設計,以解決泛型編程中,由于有些類型由模板參數決定,而難以(甚至不可能)表示之的問題。
 

1 基本語法

decltype 類型說明符生成指定表達式的類型。在此過程中,編譯器分析表達式并得到它的類型,卻不實際計算表達式的值。

語法為:

decltype( expression )

編譯器使用下列規則來確定expression 參數的類型。

如果 expression 參數是標識符或類成員訪問,則 decltype(expression) 是 expression 命名的實體的類型。如果不存在此類實體或 expression 參數命名一組重載函數,則編譯器將生成錯誤消息。
如果 expression 參數是對一個函數或一個重載運算符函數的調用,則 decltype(expression) 是函數的返回類型。將忽略重載運算符兩邊的括號。
如果 expression 參數是右值,則 decltype(expression) 是 expression類型。如果 expression參數是左值,則 decltype(expression) 是對 左值引用 類型的expression。
給出如下示例代碼:

int var;const int&& fx(); struct A { double x; }const A* a = new A();

語句 類型 注釋
decltype(fx()); const int && 對左值引用的const int
decltype(var); int 變量 var 的類型
decltype(a->x); double 成員訪問的類型
decltype((a->x)); const double& 內部括號導致語句作為表達式而不是成員訪問計算。由于a聲明為 const指針,因此類型是對const double的引用。

2 decltype和引用

如果decltype使用的表達式不是一個變量,則decltype返回表達式結果對應的類型。但是有些時候,一些表達式向decltype返回一個引用類型。一般來說,當這種情形發生時,意味著該表達式的結果對象能作為一條賦值語句的左值:

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

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

另一方面,如果表達式的內容是解引用操作,則decltype將得到引用類型。正如我們所熟悉的那樣,解引用指針可以得到指針所指對象,而且還能給這個對象賦值,因此,decltype(*p)的結果類型是int&而非int。

3 decltype和auto

處理頂層const和引用的方式不同(參考閱讀:C++ auto類型說明符)
如果decltype使用的表達式是一個變量,則decltype返回該變量的類型(包括頂層const和引用在內):

const int ci = 0, &cj = ci;decltype(ci) x = 0; // x的類型是const intdecltype(cj) y = x; // y的類型是const int&,y綁定到變量xdecltype(cj) z; // Error, z是一個引用,必須初始化

decltype的結果類型與表達式形式密切相關

對于decltype所用的引用來說,如果變量名加上了一對括號,則得到的類型與不加括號時會有所不同。如果decltype使用的是一個不加括號的變量,則得到的結果就是該變量的類型;如果給變量加上了一層或多層括號,編譯器就會把它當成是一個表達式。

decltype((i)) d; // Error, d是int&, 必須初始化decltype(i) e;  // OK, e是一個未初始化的int

模板函數的返回類型 

在 C++11 中,可以結合使用尾隨返回類型上的 decltype 類型說明符和 auto 關鍵字來聲明其返回類型依賴于其模板參數類型的模板函數。
在 C++14 中,可以使用不帶尾隨返回類型的 decltype(auto) 來聲明其返回類型取決于其模板參數類型的模板函數。
例如,定義一個求和模板函數:

//C++11 template<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++14template<typename T, typename U>decltype(auto) myFunc(T&& t, U&& u)     { return forward<T>(t) + forward<U>(u); };

(forward:如果參數是右值或右值引用,則有條件地將其參數強制轉換為右值引用。)

附上一段源碼:

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

運行結果為:

Plus(i, 9) = 13Plus(dx, dy) = 13.5Hello, world!x3.Dump() = 42


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日日狠狠久久偷偷四色综合免费| 欧美日本啪啪无遮挡网站| 国产精品久久久久久久久久久久| 九九热这里只有在线精品视| 国产精品亚洲第一区| 欧美在线视频一区二区| 国产精品揄拍一区二区| xxx欧美精品| 奇米影视亚洲狠狠色| 国产国语videosex另类| 国产精品久久久久秋霞鲁丝| 国产经典一区二区| 亚洲一区二区三区sesese| 精品久久久久久国产91| 国产成人精品亚洲精品| 亚洲国产欧美久久| 国产精品高清网站| 欧美精品免费看| 日本国产欧美一区二区三区| 久久视频免费观看| 欧美亚洲视频在线观看| 中文字幕一区日韩电影| 国产a级全部精品| 狠狠躁夜夜躁人人躁婷婷91| 亚洲丝袜av一区| 国产+人+亚洲| 精品国产91久久久久久| 国内久久久精品| 国产成人精品久久二区二区| 国产99久久精品一区二区 夜夜躁日日躁| 久久精品视频99| 久久香蕉国产线看观看网| 韩国日本不卡在线| 992tv在线成人免费观看| 国产一区二区免费| 91深夜福利视频| 久久久久日韩精品久久久男男| 亚洲欧美国产va在线影院| 7777kkkk成人观看| 欧美午夜无遮挡| 成人中文字幕在线观看| 日韩精品中文字幕在线观看| 日韩在线视频国产| 国产在线98福利播放视频| 这里只有视频精品| 国产美女91呻吟求| 亚洲精品av在线播放| 成人免费福利视频| 日韩高清电影免费观看完整版| 国产精品色婷婷视频| 亚洲理论片在线观看| 91高清视频免费| 91精品国产91久久久久久久久| 亚洲va久久久噜噜噜| 欧美国产精品va在线观看| 国产精品九九久久久久久久| 在线免费观看羞羞视频一区二区| 欧美亚洲国产视频| 26uuu另类亚洲欧美日本老年| 精品视频—区二区三区免费| 国产精品久久久久久影视| 精品福利在线观看| 亚洲欧美制服中文字幕| 日韩在线观看免费网站| 国产日韩欧美一二三区| 日本久久精品视频| 欧美日韩在线第一页| 午夜免费在线观看精品视频| 成人精品视频在线| 亚洲精品久久久久久下一站| 国产精品偷伦视频免费观看国产| 97碰在线观看| 精品久久久久久国产| 国产精品香蕉av| 国产精品白嫩美女在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲欧美日韩一区二区在线| 亚洲欧美三级在线| 精品国产一区二区三区在线观看| 久久成人这里只有精品| 奇米影视亚洲狠狠色| 国产在线视频2019最新视频| 亚洲免费av电影| 欧美激情一区二区久久久| 91免费精品国偷自产在线| 91色视频在线导航| 欧美日韩精品国产| 搡老女人一区二区三区视频tv| 亚洲一区二区三区视频| 欧美性猛交xxxxx免费看| 欧美精品免费看| 欧美理论电影在线播放| 欧美国产在线电影| 国产精品午夜视频| 久久国内精品一国内精品| 亚洲欧美综合精品久久成人| 日本成人黄色片| 亚洲欧美日韩中文在线制服| 最近中文字幕日韩精品| 日韩中文视频免费在线观看| 精品视频在线导航| 亚洲人成电影在线| 少妇久久久久久| 在线看日韩欧美| 久久久成人精品视频| 尤物yw午夜国产精品视频明星| 欧美黑人性猛交| 国产成人aa精品一区在线播放| 亚洲欧美日韩一区二区在线| 亚洲乱码国产乱码精品精天堂| 精品无人区太爽高潮在线播放| 国产精品久久久久久久久久99| 亚洲韩国日本中文字幕| 久久久噜噜噜久久中文字免| 91中文字幕在线| 欧美激情免费看| 国语自产偷拍精品视频偷| 亚洲无线码在线一区观看| 日本午夜精品理论片a级appf发布| 国产精品视频内| 中文字幕国产精品久久| 日韩高清电影好看的电视剧电影| 国产精品普通话| 日韩乱码在线视频| 欧美在线视频免费观看| 成人激情免费在线| 午夜精品美女自拍福到在线| 久久久久女教师免费一区| 欧洲亚洲女同hd| 中文字幕亚洲欧美一区二区三区| 色哟哟网站入口亚洲精品| 亚洲精品福利视频| 成人午夜两性视频| 久久国产精品久久精品| 国产精品入口日韩视频大尺度| 日本道色综合久久影院| 国产精品第10页| 91成人天堂久久成人| 亚洲国产高清自拍| 国产不卡在线观看| 3344国产精品免费看| 日韩欧美一区视频| 91高清视频免费观看| 国产精品青青在线观看爽香蕉| 亚洲国产精品99久久| 久久国产精品亚洲| 91久久精品国产91性色| 亚洲精品wwww| 揄拍成人国产精品视频| 精品国内产的精品视频在线观看| 欧美一级bbbbb性bbbb喷潮片| 亚洲人成在线观看| 91亚洲精品久久久久久久久久久久| 国产精品户外野外| 成人免费视频xnxx.com| 久久久之久亚州精品露出| 精品久久久久久久久久国产| 久久久精品日本| 欧美疯狂xxxx大交乱88av| 亚洲成人av资源网| 成人av在线天堂| 欧美最顶级的aⅴ艳星| 欧美乱大交做爰xxxⅹ性3| 亚洲欧美国产制服动漫|