摘自:深入應用C++11:代碼優化與工程級應用
1.1.1 auto類型推導
auto的特性:
auto並不能代表一個實際的類型聲明,只是一個類型聲明的“佔位符”。
使用auto聲明的變量必須馬上初始化,以讓編譯器推斷出它的實際類型,並在編譯時將auto佔位符替換爲真正的類型。
auto的推導規則:
當不聲明爲指針或引用時,auto的推導結果和初始化表達式拋棄引用和cv限定符類型一致。
當聲明爲指針或引用時,auto的推導結果將保持初始化表達式的cv屬性。(取決於其指向的類型)。
【cv限定符】是const和volatile限定符的統稱。
auto的限制:
auto不能用於函數參數(GCC上可以作爲函數參數)。
auto不能用於非靜態成員變量,可以用於帶const屬性的靜態成員變量。ISO C++禁止在類內初始化non-const static成員。
不能定義auto類型的數組,除非使用列表初始化該數組。
auto不能推導出模板的參數。
auto的實際應用:
類型聲明過於冗長時簡化代碼。
1.1.2 decltype關鍵字
獲取表達式的類型:
decltype通過表達式得到類型,可以保留住表達式的引用及const限定符。
decltype的推導規則:
exp是標識符、類訪問表達式,decltype(exp)和exp的類型一致。
exp是函數調用,decltype(exp)的返回值的類型一致。
若exp是一個左值,則decltype(exp)是exp類型的左值引用,否則和exp類型一致。
【左值、右值】
在C++11中所有的值必屬於左值、右值兩者之一,右值又可以細分爲純右值、將亡值。
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值(將亡值或純右值)。
【左值引用】
左值引用就是對一個左值進行引用的類型。
decltype的實際應用:
decltype多用於泛型編程中。如:
vector<int> vectorNum;decltype(vectorNum.begin()) it=vectorNum.begin();
decltype用於抽取變量表達式的類型。
decltype可以用於定義類型。如:
typedef decltype(nullptr) nullptr_t;
1.1.3 返回類型後置語法–auto和decltype的結合使用
返回值類型後置語法,是爲了解決函數返回值類型依賴於參數而導致難以確定返回值類型的問題。
例如:
template <typename T, typename U>
auto add(T t,U u) -> decltype (t+u)
{
return t+u;
}