在c++98標準中就存在著auto關鍵字,c++98標準中auto關鍵字用於自動變數的宣告,但在預設情況下即使不宣告auto,函式內部的變數也是具有自動儲存期的。因此由於使用極少且多餘,在c++11中已刪除這一用法。
void fun()
c++11新標準引入了auto型別說明符,採用它可以讓編譯器幫助我們分析表示式所屬的型別。自c++11以來,auto關鍵字用於兩種情況:宣告變數時根據初始化表示式自動推斷該變數的型別、宣告函式時函式返回值的佔位符。
auto可以在宣告變數時根據變數初始值的型別自動為此變數選擇匹配的型別。顯然,auto定義的變數必須含有初始值。
auto宣告變數
auto s("hello"); //const char*
auto i = 10; //i 為int型別
auto f = 3.14; //f 為double型別
auto z = new
auto(9); // int*
使用auto可以在一條語句中宣告多個變數,而由於一條宣告語句中直接有乙個基本資料型別,所以語句中所有基本資料型別都必須一樣。而&,*只是從屬於某個宣告符,不是基礎資料型別的一部分。
auto i = 0,*p = &i; //基本資料型別為int,i為int型別,p為指向int型別的指標
auto x1 = 5, x2 = 5.0; //錯誤,x1和x2的型別不一致。
當然,初始值可以為表示式,此時編譯器根據表示式的結果推斷出auto的型別
auto與表示式
auto item = val1 + val2;//由val1和val2相加的結果推斷出item的型別
但是,這麼簡單的變數宣告型別,不建議用auto關鍵字,這樣會降低程式的可讀性。而是應更清晰地直接寫出其型別。
auto關鍵字更適用於型別冗長複雜、變數使用範圍專一時,使程式更清晰易讀
auto用於型別冗長複雜的變數型別
std::vector
vec;
std::vector
::iterator::it = vec.begin();
auto it = vec.begin(); //型別同上
std::vector
::iterator::it = vec.begin();
const
auto = vec.begin(); //型別同上
復合常量,引用和auto
使用auto關鍵字做型別自動推導時,依次施加以下規則:
首先,如果初始化表示式是引用,首先去除引用;
上一步後,如果剩下的初始化表示式有頂層的const且/或volatile限定符,去除掉。
當引用作為初始值時,真正參與初始化的是引用物件的值。此時auto推斷出的型別是引用物件的型別。如下:
int i = 1;
int &r = i;
auto k = i; //int型別,非引用
auto忽略初始化表示式的const或volatile的屬性。如下:
const
int ci = 1;
auto j = c1; //j 為int 型別,忽略ci的頂層const屬性。
但是,在初始值為指向常量的指標的時候,會保留常量的const屬性。若想要具有頂層的const屬性,應該顯示指明。
const
int ci = 1;
auto p = &ci; //p 為指標且物件為整形常量,即(const int *),保留了底層const
const ci1 = ci; //ci1 為const int型別
希望宣告引用型別,則auto關鍵字還帶上&號。此時宣告引用型別,並且執行const剝除(const-stripping)
const
int ci = 1;
auto r1 = ci; //r1 為int型別
auto &r = ci; //r 型別為const int的物件ci的引用,
這是因為如果不抑制const剝除,則得到了乙個非常量引用型變數,指向了const變數,這顯然是不可接受的。
auto與陣列
初始化表示式為陣列,auto關鍵字推導的型別為指標。這是因為陣列名在初始化表示式中自動隱式轉換為首元素位址的右值。
但auto關鍵字加上引用,則auto定義變數的型別為陣列的型別。
int a[6];
auto j = a; // j 為int*型別
auto& k = a;// k 為int[6]型別
auto用於模板函式
在模板函式定義時,如果變數的型別依賴於模板引數,使用auto關鍵字使得在編譯期確定這些型別,如:
template
void multiply(t t, u u)
auto result = multiply(101, 1.414); // 結果型別是double
使用auto儲存ambda表示式型別的變數宣告
auto ptr = (double x);//型別為std:
:function(double)>函式物件
除此之外的注意事項
1.函式和模板引數不能被宣告為auto,因為這樣顯然會破壞c++編譯器的函式匹配。
void fun(auto parameter){} // 函式引數型別不可為auto
template
// 模板引數型別不可為auto
void fun(t t){}
2.定義在堆上的變數,使用了auto的表示式必須被初始化,auto是從初始值來退短出變數型別的。
auto
int i = new
int(9); //int *型別
auto
int j = new
int(); //wrong!
3.auto是乙個佔位符,並不是乙個他自己的型別,因此不能用於型別轉換或其他一些操作,如sizeof和typeid
維基百科 auto c++
c++11新特性——auto的使用
c++11特性:auto關鍵字
C 11新特性 auto關鍵字
熟悉指令碼語言的人都知道,很多指令碼語言都引入了 型別自動推斷 技術 比如python,可以直接宣告變數,在執行時進行型別檢查。隨著c 11標準的發布,c 語言也引入了型別自動推斷的功能,這就是我們今天要介紹的auto關鍵字。c 是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我...
C 11新特性 auto關鍵字
include include using namespace std template void add t t,u u int main templatet,class u auto add t t,u u decltype t u auto a 10 auto pa new auto a au...
C 11新特性 auto關鍵字
熟悉指令碼語言的人都知道,很多指令碼語言都引入了 型別自動推斷 技術 比如python,可以直接宣告變數,在執行時進行型別檢查。隨著c 11標準的發布,c 語言也引入了型別自動推斷的功能,這就是我們今天要介紹的auto關鍵字。c 是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我...