C++11系列學(xué)習(xí)之類型推導(dǎo)
auto類型推導(dǎo)
C++舊標(biāo)準(zhǔn):
具有自動(dòng)存儲(chǔ)的局部變量
auto int i = 0 //C++98
實(shí)際上我們一般不這樣寫,因?yàn)榉莝tatic變量默認(rèn)就是具有自動(dòng)存儲(chǔ)的局部變量
C++11:
讓編譯器自動(dòng)推斷出這個(gè)變量的類型,而不需要顯式指定類型
auto基本用法
演示:
auto x = 5 //x --> int auto pi = new auto(1) //pi --> int* const auto *v = &x, u = 6 //v --> const int* 、 u --> const int static auto y = 0.0 //y --> double int x = 0 auto * a = &x //a --> int* , auto為int auto b = &x //b --> int* , auto 為 int* auto c = x //c --> int& , auto為int auto d = c //d --> int , auto為int const auto e = x //e --> const int auto f = e //f --> int const auto& g = x //g --> const int& auto& h = g //h --> const int&
上面就是通常會(huì)出現(xiàn)的所有情況,其實(shí)可以類比模板參數(shù)自動(dòng)推導(dǎo)
auto 不能用于函數(shù)參數(shù)
auto 推導(dǎo)規(guī)則
黃金法則:
- 當(dāng)不聲明為指針或引用時(shí),auto的推到結(jié)果和初始化表達(dá)式拋棄引用和cv限定符(cosnt 和 volatile,下同)后類型一致
- 當(dāng)聲明為指針或引用時(shí),auto的推到結(jié)果將保持初始化表達(dá)式的cv屬性
auto 的限制
- 不能用于函數(shù)參數(shù)
- 不支持非靜態(tài)成員變量的初始化
- main函數(shù)中auto不會(huì)被推導(dǎo)為數(shù)組類型,而是指針類型
auto 適用場景
場景一:for循環(huán)中用來遍歷容器
for(auto it = resultMap.begin(); it != resultMap.end(); ++i){ //do something }
場景二:用于不知道如何定義變量,多與泛型有關(guān)
class Foo{ public: static int get(void) { return 0; } }; class Bar{ public: static const char* get(void) { return "0"; } }; template<class A> void func(void) { auto val = A::get(); // ... }
decltype 類型推導(dǎo)
decltype( exp )
exp 表示一個(gè)表達(dá)式
從格式上來看,decltype像sizeof ,但其用來在編譯時(shí)推導(dǎo)出一個(gè)表達(dá)式的類型
decltype 基本用法
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 & cosnt decltype(z) *p = &z //*p -> const int, p -> const int * decltype(z) * pi = &z //*pi -> int , pi -> int* decltype(pi) * pp = &pi //*pp -> int * ,pp -> int **
decltype和&結(jié)合的推導(dǎo)結(jié)果,與引用折疊規(guī)則有關(guān),將在本系列后續(xù)中詳細(xì)講解
decltype 推導(dǎo)規(guī)則
黃金法則:
- exp是標(biāo)識(shí)符、類訪問表達(dá)式,
decltype
(exp) 和exp的類型一致 - exp是寒素調(diào)用,
decltype
(exp) 和返回值 的類型一致 - 其他情況,若exp是個(gè)左值,則 ecltype(exp) 是exp類型的左值引用,否則和exp類型一致
decltype 適用場景
decltype適用于泛型相關(guān)
場景一:
標(biāo)準(zhǔn)庫中有些類型的定義
typedef decltype(nullptr) nullptr_t typedef decltype(sizeof(0)) size_t `
場景二:
通過變量表達(dá)式抽取變量類型實(shí)現(xiàn)簡寫
vector<int> v; decltype(v):value_type i = 0
場景三:
template<class ContainerT> class Foo { decltype(ContainerT().begin()) it_; public: void func(ContarinerT& container) { it_ = container.begin(); } // ... }
auto 和 decltype結(jié)合——返回類型后置
即通過兩個(gè)結(jié)合起來,使得語法更加靈活便捷
int & foo(int& i); float foo(float& f) template<typename T> auto fun(T& val) -> decltype(foo(val)) { return foo(val); }
小結(jié)
auto
和decltype
的出現(xiàn)不僅彌補(bǔ)了C++舊版標(biāo)準(zhǔn)的不足,也大大解放了開發(fā)人員的生產(chǎn)力,提升了效率。但是我們?cè)谑褂玫臅r(shí)候仍然需要注意,不能濫用,否則會(huì)出現(xiàn)我們期望得到的類型和最終程序的類型不一致,導(dǎo)致一些意想不到的BUG,給我維護(hù)增加了成本,適用和巧用才是正解!
到此這篇關(guān)于C++11系列學(xué)習(xí)之類型推導(dǎo)的文章就介紹到這了,更多相關(guān)C++11類型推導(dǎo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2022連接sqlserver數(shù)據(jù)庫教程
本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C++求解二叉樹的下一個(gè)結(jié)點(diǎn)問題
本文將通過C++求解以下問題:給定一個(gè)二叉樹其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。文中示例代碼講解詳細(xì),感興趣的可以了解一下2022-04-04VC++ 6.0 C語言實(shí)現(xiàn)俄羅斯方塊詳細(xì)教程
這篇文章主要為大家介紹了VC++ 6.0 C語言實(shí)現(xiàn)俄羅斯方塊詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06c語言中實(shí)現(xiàn)數(shù)組幾個(gè)數(shù)求次大值
這篇文章主要介紹了c語言中實(shí)現(xiàn)數(shù)組幾個(gè)數(shù)求次大值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12