C++11 關鍵字auto、decltype
阿新 • • 發佈:2022-05-10
C++11新加了兩個關鍵字:auto和decltype。
用於在編譯期推匯出變數或表示式的型別,方便開發者簡化程式碼。
auto
編譯期推導變數型別。
例:auto x = 1;
推導規則
- 必須初始化。
- 在一行定義多個變數時,不能有二義性。
- 無法推匯出模板引數。
- 不能定義陣列
- 不能用於函式引數
cv推導規則,cv是指const 和volatile。
- 在不宣告為引用或指標時,auto會忽略等號右邊的引用型別和cv限定
- 在宣告為引用或者指標時,auto會保留等號右邊的引用和cv屬性
什麼時候使用auto?
不影響程式碼可讀性為前提。
作用域範圍較小的變數儘量使用auto。
不關心型別的時候。
auto必須初始化,可以強制寫程式碼時賦預設值。
decltype
編譯期推導表示式型別。編譯器分析表示式的型別,不會執行表示式。“declare type”的縮寫。
decltype會保留表示式的引用和cv屬性。
int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因為(a+b)返回一個右值
decltype(a += b) d = c;// d是int&,因為(a+=b)返回一個左值
推導規則
-
exp是表示式,decltype(exp)和exp型別相同
-
exp是函式呼叫,decltype(exp)和函式返回值型別相同
-
其他情況,若exp是左值,decltype(exp)是exp型別的左值引用
auto和decltype配合使用
使用在推導函式返回值的型別問題上。
//C++11
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
auto x = add(1, 1.2);//x是double
auto用來佔位,decltype用來推導型別。當T和U型別不同時,使用範圍很廣。
C++14簡化了寫法,支援decltype(auto),不用重複寫一遍括號裡面的exp。
//C++14 template<typename T, typename U> decltype(auto) add(T t, U u) { return t + u; } auto x = add(1, 1.2);//x是double