1. 程式人生 > 其它 >C++11 關鍵字auto、decltype

C++11 關鍵字auto、decltype

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