中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ decltype的使用方法

發布時間:2021-07-09 18:27:11 來源:億速云 閱讀:136 作者:chen 欄目:開發技術

這篇文章主要介紹“C++ decltype的使用方法”,在日常操作中,相信很多人在C++ decltype的使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++ decltype的使用方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1.什么是decltype     

        decltype是C++11新增的一個關鍵字,和auto的功能一樣,用來在編譯時期進行自動類型推導。引入decltype是因為auto并不適用于所有的自動類型推導場景,在某些特殊情況下auto用起來很不方便,甚至壓根無法使用。

對于內置類型的對象,使用decltype很直觀,但當參數為復合類型的時候就應該注意一些使用細節問題。

auto varName=value;
decltype(exp) varName=value;
  •  auto根據=右邊的初始值推導出變量的類型,decltype根據exp表達式推導出變量的類型,跟=右邊的value沒有關系

  • auto要求變量必須初始化,這是因為auto根據變量的初始值來推導變量類型的,如果不初始化,變量的類型也就無法推導

  • 而decltype不要求,因此可以寫成如下形式

decltype(exp) varName;

原則上將,exp只是一個普通的表達式,它可以是任意復雜的形式,但必須保證exp的結果是有類型的,不能是void;如exp為一個返回值為void的函數時,exp的結果也是void類型,此時會導致編譯錯誤

1.1decltype的幾種形式

int x = 0;
decltype(x) y = 1;           // y -> int
decltype(x + y) z = 0;       // z -> int
const int& i = x;
decltype(i) j = y;           // j -> const int &
const decltype(z) * p = &z;  // *p  -> const int, p  -> const int *
decltype(z) * pi = &z;       // *pi -> int      , pi -> int *
decltype(pi)* pp = π      // *pp -> int *    , pp -> int * *

2.推導規則

     decltype的推導規則可以簡單概述如下:

  • 如果exp是一個不被括號()包圍的表達式,或者是一個類成員訪問表達式,或者是一個單獨的變量,decltype(exp)的類型和exp一致

  • 如果exp是函數調用,則decltype(exp)的類型就和函數返回值的類型一致

  • 如果exp是一個左值,或被括號()包圍,decltype(exp)的類型就是exp的引用,假設exp的類型為T,則decltype(exp)的類型為T&

規則1示例:

#include<string> 
#include<iostream>
using namespace std;
 
class A{
public:
    static int total;
    string name;
    int age;
    float scores;
}
 
int A::total=0;
 
int main()
{
int n=0;
const int &r=n;
A a;
decltype(n) x=n;    //n為Int,x被推導為Int
decltype(r) y=n;    //r為const int &,y被推導為const int &
decltype(A::total)  z=0;  ///total是類A的一個int 類型的成員變量,z被推導為int
decltype(A.name) url="www.baidu.com";//url為stringleix
return 0;
}

規則2示例:

int& func1(int ,char);//返回值為int&
int&& func2(void);//返回值為int&&
int func3(double);//返回值為int
 
const int& func4(int,int,int);//返回值為const int&
const int&& func5(void);//返回值為const int&&
 
int n=50;
decltype(func1(100,'A')) a=n;//a的類型為int&
decltype(func2()) b=0;//b的類型為int&&
decltype(func3(10.5)) c=0;//c的類型為int
 
decltype(func4(1,2,3)) x=n;//x的類型為const int&
decltype(func5()) y=0;//y的類型為const int&&

exp中調用函數時需要帶上括號和參數,但這僅僅是形式,并不會真的去執行函數代碼

規則3示例:

class A{
public:
   int x;
}
 
int main()
{
const A obj;
decltype(obj.x) a=0;//a的類型為int
decltype((obj.x)) b=a;//b的類型為int&
 
int n=0,m=0;
decltype(m+n) c=0;//n+m得到一個右值,c的類型為int
decltype(n=n+m) d=c;//n=n+m得到一個左值,d的類型為int &
return 0;
}

左值:表達式執行結束后依然存在的數據,即持久性數據;右值是指那些在表達式執行結束不再存在的數據,即臨時性數據。一個區分的簡單方法是:對表達式取地址,如果編譯器不報錯就是左值,否則為右值

3.實際應用

     類的靜態成員可以使用auto, 對于類的非靜態成員無法使用auto,如果想推導類的非靜態成員的類型,只能使用decltype。

示例如下:

template<typename T>
class A
{
private :
   decltype(T.begin()) m_it;
   //typename T::iterator m_it;   //這種用法會出錯
public:
void func(T& container)
{
   m_it=container.begin();
}
};
 
int main()
{
 
const vector<int> v;
A<const vector<int>> obj;
obj.func(v);
return 0;
}

到此,關于“C++ decltype的使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

察哈| 永州市| 周宁县| 巴里| 锡林浩特市| 英吉沙县| 涞水县| 元朗区| 响水县| 福泉市| 石楼县| 吉水县| 玉溪市| 乃东县| 古丈县| 万盛区| 焉耆| 武汉市| 通海县| 洛南县| 当涂县| 仁寿县| 钟山县| 上饶县| 崇仁县| 海盐县| 临泉县| 分宜县| 怀仁县| 宝鸡市| 大新县| 广昌县| 乌鲁木齐县| 保亭| 合江县| 陆丰市| 上饶县| 东乡族自治县| 甘肃省| 雷波县| 普洱|