auto關鍵字的作用

2021-09-23 17:08:41 字數 2329 閱讀 2376

在 c 語言以及 c++98 時代,auto 關鍵字的作用並不大,僅用於宣告變數是自動型別的變數,具有自動儲存期,這種型別的變數在進入變數宣告的程式塊中才被建立,程式退出程式塊時該變數就被撤銷,在函式內部定義的變數具有自動變數的屬性。

void func()

int num = 0;        // num 就是乙個自動型別的變數,實際上等同於 auto int num = 0;

而到了 c++11 時代,auto 關鍵字可以用於變數型別的推斷,我們可以在宣告變數的時候根據變數初始值的型別自動為該變數選擇合適的型別,而不需要我們顯式指定型別。

auto x = 127;               // auto 被推斷為 int 型別

auto y = 3.14;              // auto 被推斷為 double 型別

auto z;                         // 錯誤,必須有初始值才能進行推斷

int x = 0, &rx = x; 

auto a1 = rx;               // 使用引用其實是使用引用的物件,此時 auto 以引用物件的型別作為 auto 的型別,所以 auto 這裡被推斷為 int 

auto &a2 = rx;            // 此時 auto 被推斷為 int 型別,a2 物件本身就是 int & 型別

const auto &a3 = rx;  // auto 被推斷為 int 型別,a3 物件本身是 const int & 型別,不能通過 a3 去修改 rx 引用的物件值

const int c = 10;

auto a1 = c;            // auto 此時是 int,頂層 const 屬性被丟棄

auto &a2 = c;         // auto 此時是 const int,底層 const 屬性保留

const char arr = "i love china";

auto r1 = arr;                                        // 如果將陣列名賦值給 auto 變數,那麼 auto 推斷的結果是指標型別,如果有 const 屬性

// 會被保留,auto 推斷的結果是 const char *,r1 為 const char *

auto &r2 = arr;                                      // 如果將陣列名賦值給 auto & 變數,auto & 變數的型別是乙個陣列引用型別,即為

// const char (&) [14] 

int add(int a,int b);                                // 函式宣告

auto r3 = add;                                      // r3 為 int(*)(int, int)

auto &r4 = add;                                    // r4 為 int(&)(int, int)

推斷規則說明

① 對於普通型別推斷(沒有 const 也不摻雜引用的),直接根據表示式右邊值的型別進行推斷,注意必須有初始值

② 使用引用進行推斷,實際上就是使用引用物件的型別進行推斷,此時引用特性會被丟棄,如果定義的物件需要成為引用,就自己在 auto 後面加上 & 來定義物件

③ 使用帶有 const 屬性的物件進行推斷時,如果定義的物件不是指標或者引用,則 const 屬性會被丟棄,否則 const 屬性會保留,見 (3) const 型別的推斷

auto關鍵字說明

auto 自動型別推斷發生在編譯期,所以使用 auto 關鍵字不會降低程式的執行效率

(1) 一些型別長度書寫很長的,可以使用 auto 來簡化,如 for(std::vector::iterator it = v.begin();it != v.end();++it),如果使用 auto 可以直接寫為 for(auto it = v.begin();it != v.end();++it)

(2) 當函式返回的值不確定時,可以使用 auto 做返回值型別,更加方便,編譯器會根據返回值的型別推斷 auto 的型別,這種語法是在 c++14 才出現的。

auto func()        // 這種寫法在 c++14 是允許的

return 0;   

(1) 函式引數型別不能是 auto 型別,比如 int add(auto a, auto b) 是不允許的

(2) 類的成員變數不可以是 auto 型別。類的靜態成員變數可以是 auto 型別的,但是需要使用 const 修飾,而且該變數的值在類內初始化

auto關鍵字作用

在定義變數時,使用auto可以讓變數定義為初始化的值型別。auto a 1 auto b string 123 在模板函式內,返回值可以省去型別,由編譯器推導。如果在c 11舊版本,需要使用decltype關鍵字手動推導。templateauto add t x,s y intmain 匿名函式無法...

auto關鍵字 decltype關鍵字

自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...

auto關鍵字使用

auto型別變數 根據初始值推斷真實的資料型別。有些時候並不能很確定乙個變數應該具備的資料型別,例如 將乙個複雜表示式的值賦給某個變數,此時並不能很明顯的確定這個值所具備的資料型別。此時auto關鍵字可以派上用場。auto儲存型別說明符宣告了乙個自動變數,auto物件和變數被儲存在棧中,它的生命週期...