1. 程式人生 > >decltype關鍵字

decltype關鍵字

有時 fun 表達 括號 函數重載 字面值 使用 i++ tro

  • decltype用於編譯時類型推導,是以一個普通表達式作為參數,返回該表達式的類型,而且decltype並不會對表達式進行求值。
  • decltype的用法:
    1 //推導出表達式類型
    2int i = 4;
    3decltype(i) a;//首先推導變量i的類型為int,然後通過返回結果聲明變量a,a的類型為int

  • 在C++中,我們有時候會遇上一些匿名類型,如:
  • 1struct2{
    3int d;
    4double b;
    5}anon_s;

    而借助decltype,我們可以重新使用這個匿名的結構體:

  • 1decltype(anon_s) as;//定義了一個上面匿名的結構體

  • decltype推導四規則:
    • 如果e是一個沒有帶括號的標記符表達式或者類成員訪問表達式,那麽decltype(e)就是e所命名的實體的類型(註意:如果e是一個被重載的函數,則會導致編譯錯誤)
    • 否則,假設e的類型是T,如果e是一個將亡值,那麽decltype(e)為T&&
    • 否則,假設e的類型為T,如果e是一個左值,那麽decltype(e)為T&
    • 否則,假設e的類型為T,則decltype(e)為T
  • 舉例說明:
  •  1 int i = 4;
     2 int arr[5] = {0};
     3 int *ptr = arr;
     4 struct s
     5 {
     6     double d;
     7 }s;
     8 void Overloaded(int);
     9 void Overloaded(char);//函數重載
    10 int && RvalRef();
    
    11 const bool Func(int); 12 13 //規則1,推導為其類型 14 decltype (arr) var1;//沒有括號的標記符表達式,為其實體類型int 15 decltype(ptr) var2;//沒有括號的標記符表達式,為其實體類型int * 16 decltype(s.d) var3;//沒有括號的類成員訪問表達式,為其實體類型double 17 decltype(Overloaded) var4;//重載函數,編譯錯誤 18 19 //規則2,將亡值,推導為類型的右值引用 20 decltype (RvalRef()) var5 = 1; 21 22 //規則3,左值,推導為類型的引用
    23 decltype ((i)) var6 = i; //int & 24 decltype (true ? i:i) var7 =i;//int & 25 decltype (++i) var8 =i; //int & 26 decltype (arr[5]) var9 =i;//int & 27 decltype (*ptr) var10 = i; 28 decltype ("hello") var11 = "hello";//const char(&) [9],字符串字面常量為左值,且為const左值 29 30 //規則4:以上都是不,則推導為本類型 31 decltype (1) var12; //const int 32 decltype (Func(1)) var 13 = true;//const bool 33 decltype(i++) var14 = i;//int i++返回右值

  • 註意:字符串字面值常量為左值,而且是const左值,而非字符串字面常量則是右值

decltype關鍵字