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雖然對於不同場景下得到的類型不同,但是建議在一些不容易產生歧義的方面使用,不應犧牲程式碼的可讀性。