最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ decltype用法舉例說明

 更新時間:2021年07月09日 15:40:16   作者:qq_38196982  
decltype是C++11添加的一個新的關(guān)鍵字,目的是選擇并返回操作數(shù)的數(shù)據(jù)類型,重要的是,在此過程中編譯器分析表達(dá)式并得到它的類型,卻不實際計算表達(dá)式的值,今天通過本文給大家介紹C++ decltype用法,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧

1.什么是decltype     

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

對于內(nèi)置類型的對象,使用decltype很直觀,但當(dāng)參數(shù)為復(fù)合類型的時候就應(yīng)該注意一些使用細(xì)節(jié)問題。

auto varName=value;
decltype(exp) varName=value;
  •  auto根據(jù)=右邊的初始值推導(dǎo)出變量的類型,decltype根據(jù)exp表達(dá)式推導(dǎo)出變量的類型,跟=右邊的value沒有關(guān)系
  • auto要求變量必須初始化,這是因為auto根據(jù)變量的初始值來推導(dǎo)變量類型的,如果不初始化,變量的類型也就無法推導(dǎo)
  • 而decltype不要求,因此可以寫成如下形式

decltype(exp) varName;

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

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.推導(dǎo)規(guī)則

     decltype的推導(dǎo)規(guī)則可以簡單概述如下:

  • 如果exp是一個不被括號()包圍的表達(dá)式,或者是一個類成員訪問表達(dá)式,或者是一個單獨的變量,decltype(exp)的類型和exp一致
  • 如果exp是函數(shù)調(diào)用,則decltype(exp)的類型就和函數(shù)返回值的類型一致
  • 如果exp是一個左值,或被括號()包圍,decltype(exp)的類型就是exp的引用,假設(shè)exp的類型為T,則decltype(exp)的類型為T&

規(guī)則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被推導(dǎo)為Int
decltype(r) y=n;    //r為const int &,y被推導(dǎo)為const int &
decltype(A::total)  z=0;  ///total是類A的一個int 類型的成員變量,z被推導(dǎo)為int
decltype(A.name) url="www.baidu.com";//url為stringleix
return 0;
}

規(guī)則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中調(diào)用函數(shù)時需要帶上括號和參數(shù),但這僅僅是形式,并不會真的去執(zhí)行函數(shù)代碼

規(guī)則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;
}

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

3.實際應(yīng)用

     類的靜態(tài)成員可以使用auto, 對于類的非靜態(tài)成員無法使用auto,如果想推導(dǎo)類的非靜態(tài)成員的類型,只能使用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;
}

到此這篇關(guān)于C++ decltype用法舉例說明的文章就介紹到這了,更多相關(guān)C++ decltype內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Opencv實現(xiàn)最小外接矩形和圓

    Opencv實現(xiàn)最小外接矩形和圓

    這篇文章主要為大家詳細(xì)介紹了Opencv實現(xiàn)最小外接矩形和圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++-操作符重載、并實現(xiàn)復(fù)數(shù)類詳解

    C++-操作符重載、并實現(xiàn)復(fù)數(shù)類詳解

    這篇文章主要介紹了C++-操作符重載、并實現(xiàn)復(fù)數(shù)類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • VC實現(xiàn)對話框窗口任意分割

    VC實現(xiàn)對話框窗口任意分割

    最近寫MFC的程序,想在對話框里實現(xiàn)窗口的任意分割。現(xiàn)在網(wǎng)絡(luò)資料一大抄,找個東西實在麻煩??偹氵@個很簡單,很快就搞定了,寫下來做個筆記。
    2015-06-06
  • C++中 map的基本操作

    C++中 map的基本操作

    map是一類關(guān)聯(lián)式容器。接下來通過本文給大家分享c++中的map基本操作,需要的朋友參考下
    2017-05-05
  • C語言中二級指針的實例詳解

    C語言中二級指針的實例詳解

    這篇文章主要介紹了C語言中二級指針的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握理解二級指針的知識,需要的朋友可以參考下
    2017-10-10
  • C++實現(xiàn)DES加密算法實例解析

    C++實現(xiàn)DES加密算法實例解析

    這篇文章主要介紹了C++實現(xiàn)DES加密算法實例解析,是一個很實用的功能,需要的朋友可以參考下
    2014-08-08
  • C++迭代器失效問題及解決

    C++迭代器失效問題及解決

    這篇文章主要介紹了C++迭代器失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Qt實現(xiàn)數(shù)據(jù)導(dǎo)出到xls的示例代碼

    Qt實現(xiàn)數(shù)據(jù)導(dǎo)出到xls的示例代碼

    導(dǎo)入導(dǎo)出數(shù)據(jù)到csv由于語法簡單,適用場景有限,于是本文將為大家介紹Qt如何實現(xiàn)導(dǎo)出數(shù)據(jù)到xls,感興趣的小伙伴可以跟隨小編一起試一試
    2022-01-01
  • c++字符串char[]數(shù)組分割split問題

    c++字符串char[]數(shù)組分割split問題

    這篇文章主要介紹了c++字符串char[]數(shù)組分割split問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 新版本Qt Creator安裝配置的實現(xiàn)步驟

    新版本Qt Creator安裝配置的實現(xiàn)步驟

    本文詳細(xì)介紹了如何在Windows11環(huán)境下,使用Qt5.14.2和VS2017安裝并配置最新版本的QtCreator10.0.2,文中通過圖文示例介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07

最新評論

曲阳县| 库尔勒市| 阿瓦提县| 福泉市| 大名县| 甘肃省| 临汾市| 怀柔区| 伊川县| 山东省| 富蕴县| 杭州市| 西昌市| 基隆市| 清流县| 神池县| 丰城市| 湘乡市| 思茅市| 阳江市| 登封市| 吉隆县| 得荣县| 淄博市| 行唐县| 涟水县| 车险| 临海市| 石楼县| 于都县| 东乡| 灵武市| 万年县| 晴隆县| 临澧县| 桓台县| 南华县| 香港| 蒲城县| 蓝山县| 尼木县|