C++11新特性:auto和decltype

@著作權歸作者所有:來自CSDN博客作者大鬍子的艾娃的原創作品,如需轉載,請註明出處https://blog.csdn.net/qq_43148810,否則將追究法律責任。
如有錯誤的地方歡迎指正,謝謝!

一、auto作用
編程時候常常需要把表達式的值賦給變量,需要在聲明變量的時候清楚的知道變量是什麼類型。然而做到這一點並非那麼容易(特別是模板中),有時候根本做不到。爲了解決這個問題,C++11新標準就引入了auto類型說明符,用它就能讓編譯器替我們去分析表達式所屬的類型。和原來那些只對應某種特定的類型說明符(例如 int)不同。auto 讓編譯器通過初始值來進行類型推演。從而獲得定義變量的類型,所以說 auto 定義的變量必須有初始值
建議在泛型編程的時使用,可能類型不確定時用auto。也有時候爲了偷懶代替很長的類型,但是不要濫用,會降低程序效率和代碼可讀性。

二、decltype作用
用於檢查實體的聲明類型或表達式的類型及值分類。可以從表達式、函數的返回類型中推斷出要定義變量的類型。

1、語法:

decltype ( expression )

2、使用:

// 尾置返回允許我們在參數列表之後聲明返回類型
template <typename It>
auto fcn(It beg, It end) -> decltype(*beg)
{
    // 處理序列
    return *beg;    // 返回序列中一個元素的引用
}
// 爲了使用模板參數成員,必須用 typename
template <typename It>
auto fcn2(It beg, It end) -> typename remove_reference<decltype(*beg)>::type
{
    // 處理序列
    return *beg;    // 返回序列中一個元素的拷貝
}

三、decltype 和 auto 區別
1、decltype包括頂層const和引用在內,而auto會忽略。
2、如果表達式的內容是解引用操作,則decltype將得到引用類型。正如我們所熟悉的那樣,解引用指針可以得到指針所指對象,而且還可以給這個對象賦值。因此decltype(*p)的結果類型就是int&。
3、如果給這個變量加上一個或多層括號,那麼編譯器會把這個變量當作一個表達式看待,變量是一個可以作爲左值的特殊表達式,所以這樣的decltype就會返回引用類型。

	const int ci = 42, &cj = ci;
	int i = 42, *p = &i, &r = i;
	//1
	decltype(ci) x = 0;   // x 類型爲const int
	auto z = ci;          // z 類型爲int
	//2
	decltype(cj) y = x;   // y 類型爲const int&
	auto h = cj;          // h 類型爲int
	//3
	decltype(r) y1 = i;       //因爲 r 爲 int& ,所以 y1 爲int&
	auto y2 = r;              //因爲 r 爲 int& ,但auto會忽略引用,所以 y2 爲int
	//4
	decltype(*p) h1 = i;      //這裏 h1 是int&
	auto h2 = *p;             // h2 爲 int
	//5
	//decltype(i)   int  類型
	//decltype((i)) int& 類型

總結:auto 和 decltype過程中主要區分const非const以及引用非引用引起的差別

更多內容請關注個人博客:https://blog.csdn.net/qq_43148810

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章