decltype–從表達式推斷類型
- 2019 年 11 月 23 日
- 筆記
前言
在《不想寫表達式的類型?試試auto吧》中介紹了自動類型推導,它需要有初始值,今天再來介紹一個C++11中的特性,decltype。
作用
- 從表達式類型推斷要定義的變數類型
- 聲明返回類型依賴形參類型的函數模板
不過decltype並不會對表達式進行求值。
用法
decltype根據表達式的類型來獲取類型。
int a = 1024; decltype(a) b;//decltype(a),得到int,b為int類型 const char c = 'c'; decltype(c) d = 'd';//d是 const char int &e = a; int g = 11; decltype(e) f = g ;//f是int &,必須初始化
不過下面這種情況需要注意:
int a = 10; int *p = &a; decltype(*p) c= a; //c是int &
雖然*p解引用後得到int,但是,c是引用類型,即如果表達式的內容是解引用,將會得到引用類型。
還有雙重括弧的情況:
int a = 10; decltype((a)) b = a;//b是int &
如果加了雙重括弧,它最終也會得到引用類型。
常見應用場景
泛型編程中,如果返回類型與形參類型相關,那麼可以使用下面的方式:
//來源:公眾號【編程珠璣】 https://www.yanbinghu.com#include<iostream> template <typename T> auto add(T x, T y)->decltype(x) { return x+y; } int main() { int a = 10; int b = 12; auto c = add(a,b); std::cout<<c<<std::endl; return 0; }
add函數的返回類型與形參類型T有關,因此為了得到返回類型,我們使用auto關鍵字,但是需要decltype指明是通過表達式x得到的類型。
再比如你想給某個複雜類型取一個別名:
vector<int> vec typedef decltype(vec.begin()) vecItType;
總結
decltype雖然對於不同場景下得到的類型不同,但是建議在一些不容易產生歧義的方面使用,不應犧牲程式碼的可讀性。