C++ decltype用法舉例說明
1.什么是decltype
decltype是C++11新增的一個(gè)關(guān)鍵字,和auto的功能一樣,用來在編譯時(shí)期進(jìn)行自動(dòng)類型推導(dǎo)。引入decltype是因?yàn)閍uto并不適用于所有的自動(dòng)類型推導(dǎo)場景,在某些特殊情況下auto用起來很不方便,甚至壓根無法使用。
對于內(nèi)置類型的對象,使用decltype很直觀,但當(dāng)參數(shù)為復(fù)合類型的時(shí)候就應(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要求變量必須初始化,這是因?yàn)閍uto根據(jù)變量的初始值來推導(dǎo)變量類型的,如果不初始化,變量的類型也就無法推導(dǎo)
- 而decltype不要求,因此可以寫成如下形式
decltype(exp) varName;
原則上將,exp只是一個(gè)普通的表達(dá)式,它可以是任意復(fù)雜的形式,但必須保證exp的結(jié)果是有類型的,不能是void;如exp為一個(gè)返回值為void的函數(shù)時(shí),exp的結(jié)果也是void類型,此時(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ī)則可以簡單概述如下:
- 如果exp是一個(gè)不被括號()包圍的表達(dá)式,或者是一個(gè)類成員訪問表達(dá)式,或者是一個(gè)單獨(dú)的變量,decltype(exp)的類型和exp一致
- 如果exp是函數(shù)調(diào)用,則decltype(exp)的類型就和函數(shù)返回值的類型一致
- 如果exp是一個(gè)左值,或被括號()包圍,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的一個(gè)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í)需要帶上括號和參數(shù),但這僅僅是形式,并不會(huì)真的去執(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得到一個(gè)右值,c的類型為int
decltype(n=n+m) d=c;//n=n+m得到一個(gè)左值,d的類型為int &
return 0;
}
左值:表達(dá)式執(zhí)行結(jié)束后依然存在的數(shù)據(jù),即持久性數(shù)據(jù);右值是指那些在表達(dá)式執(zhí)行結(jié)束不再存在的數(shù)據(jù),即臨時(shí)性數(shù)據(jù)。一個(gè)區(qū)分的簡單方法是:對表達(dá)式取地址,如果編譯器不報(bào)錯(cuò)就是左值,否則為右值
3.實(shí)際應(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; //這種用法會(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;
}
到此這篇關(guān)于C++ decltype用法舉例說明的文章就介紹到這了,更多相關(guān)C++ decltype內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
C語言模擬實(shí)現(xiàn)atoi函數(shù)的實(shí)例詳解
這篇文章主要介紹了C語言模擬實(shí)現(xiàn)atoi函數(shù)的實(shí)例詳解的相關(guān)資料,atoi函數(shù),主要功能是將一個(gè)字符串轉(zhuǎn)變?yōu)檎麛?shù),這里就實(shí)現(xiàn)這樣的函數(shù),需要的朋友可以參考下2017-08-08
探討:程序在內(nèi)存中的分配(常量,局部變量,全局變量,程序代碼)問題
本篇文章是對程序在的內(nèi)存中分配(常量,局部變量,全局變量,程序代碼)的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

