溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++的decltype怎么使用

發(fā)布時(shí)間:2022-03-28 10:17:36 來(lái)源:億速云 閱讀:158 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C++的decltype怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.什么是decltype     

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

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

auto varName=value;
decltype(exp) varName=value;
  •  auto根據(jù)=右邊的初始值推導(dǎo)出變量的類(lèi)型,decltype根據(jù)exp表達(dá)式推導(dǎo)出變量的類(lèi)型,跟=右邊的value沒(méi)有關(guān)系

  • auto要求變量必須初始化,這是因?yàn)閍uto根據(jù)變量的初始值來(lái)推導(dǎo)變量類(lèi)型的,如果不初始化,變量的類(lèi)型也就無(wú)法推導(dǎo)

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

decltype(exp) varName;

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

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ī)則可以簡(jiǎn)單概述如下:

  • 如果exp是一個(gè)不被括號(hào)()包圍的表達(dá)式,或者是一個(gè)類(lèi)成員訪問(wèn)表達(dá)式,或者是一個(gè)單獨(dú)的變量,decltype(exp)的類(lèi)型和exp一致

  • 如果exp是函數(shù)調(diào)用,則decltype(exp)的類(lèi)型就和函數(shù)返回值的類(lèi)型一致

  • 如果exp是一個(gè)左值,或被括號(hào)()包圍,decltype(exp)的類(lèi)型就是exp的引用,假設(shè)exp的類(lèi)型為T(mén),則decltype(exp)的類(lèi)型為T(mén)&

規(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是類(lèi)A的一個(gè)int 類(lèi)型的成員變量,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的類(lèi)型為int&
decltype(func2()) b=0;//b的類(lèi)型為int&&
decltype(func3(10.5)) c=0;//c的類(lèi)型為int
 
decltype(func4(1,2,3)) x=n;//x的類(lèi)型為const int&
decltype(func5()) y=0;//y的類(lèi)型為const int&&

exp中調(diào)用函數(shù)時(shí)需要帶上括號(hào)和參數(shù),但這僅僅是形式,并不會(huì)真的去執(zhí)行函數(shù)代碼

規(guī)則3示例:

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

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

3.實(shí)際應(yīng)用

     類(lèi)的靜態(tài)成員可以使用auto, 對(duì)于類(lèi)的非靜態(tài)成員無(wú)法使用auto,如果想推導(dǎo)類(lèi)的非靜態(tài)成員的類(lèi)型,只能使用decltype。

示例如下:

template<typename T>
class A
{
private :
   decltype(T.begin()) m_it;
   //typename T::iterator m_it;   //這種用法會(huì)出錯(cuò)
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怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI