早在c++98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期:
int a =10 ; //擁有自動生命期
auto int b = 20 ;//擁有自動生命期
static int c = 30 ;//延長了生命期
c++98中的auto多餘且極少使用,c++11已經刪除了這一用法,取而代之的是全新的auto:變數的自動型別推斷。
回到頂部
auto可以在宣告變數的時候根據變數初始值的型別自動為此變數選擇匹配的型別,類似的關鍵字還有decltype。舉個例子:
int a = 10;
auto au_a = a;//自動型別推斷,au_a為int型別
cout << typeid(au_a).name() << endl;
typeid運算子可以輸出變數的型別。程式的執行結果輸出了
int這種用法就類似於c#中的var關鍵字。auto的自動型別推斷發生在編譯期,所以使用auto並不會造成程式執行時效率的降低。而是否會造成編譯期的時間消耗,我認為是不會的,在未使用auto時,編譯器也需要得知右運算元的型別,再與左運算元的型別進行比較,檢查是否可以發生相應的轉化,是否需要進行隱式型別轉換。
回到頂部
上面舉的這個例子很簡單,在真正程式設計的時候也不建議這樣來使用auto,直接寫出變數的型別更加清晰易懂。下面列舉auto關鍵字的正確用法。
想象一下在沒有auto的時候,我們操作標準庫時經常需要這樣:
#include#includeint main()
}
這樣看**寫**實在煩得很。有人可能會說為何不直接使用using namespace std,這樣**可以短一點。實際上這不是該建議的方法(c++primer對此有相關敘述)。使用auto能簡化**:
#include#includeint main()
}
for迴圈中的i將在編譯時自動推導其型別,而不用我們顯式去定義那長長的一串。
template void multiply(_tx x, _ty y)
若不使用auto變數來宣告v,那這個函式就難定義啦,不到編譯的時候,誰知道x*y的真正型別是什麼呢?
template auto multiply(_tx x, _ty y)->decltype(x*y)
當模板函式的返回值依賴於模板的引數時,我們依舊無法在編譯**前確定模板引數的型別,故也無從知道返回值的型別,這時我們可以使用auto。格式如上所示。
decltype操作符用於查詢表示式的資料型別,也是c++11標準引入的新的運算子,其目的也是解決泛型程式設計中有些型別由模板引數決定,而難以表示它的問題。
auto在這裡的作用也稱為返回值佔位,它只是為函式返回值佔了乙個位置,真正的返回值是後面的decltype(_tx*_ty)。為何要將返回值後置呢?如果沒有後置,則函式宣告時為:
decltype(x*y)multiply(_tx x, _ty y)
而此時x,y還沒宣告呢,編譯無法通過。
回到頂部
分類: c++
好文要頂
關注我收藏該文
自由真實個性
關注 - 2
粉絲 - 2
+加關注 收藏
c auto關鍵字使用
c 11 auto可以在宣告變數的時候根據變數初始值的型別自動為此變數選擇匹配的型別,類似的關鍵字還有 decltype 舉個例子 int a 10 auto au a a 自動型別推斷,au a為int型別 cout typeid au a name endl typeid運算子可以輸出變數的型別...
C auto 關鍵字的使用
c auto 關鍵字的使用 早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期 int a 10 擁有自動生命期 auto int b 20 擁有自動生命期 static in...
C auto關鍵字用法
c 98 auto 早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期 int a 10 擁有自動生命期 auto int b 20 擁有自動生命期 static int c ...