c++11 auto可以在宣告變數的時候根據變數初始值的型別自動為此變數選擇匹配的型別,類似的關鍵字還有
decltype
。舉個例子:
int a = 10;
auto au_a = a;//自動型別推斷,au_a為int型別
cout << typeid(au_a).name() << endl;
typeid運算子可以輸出變數的型別。程式的執行結果輸出了
int
auto和其他變數型別有明顯的區別:
1.auto宣告的變數必須要初始化,否則編譯器不能判斷變數的型別。
2.auto不能被宣告為返回值,auto不能作為形參,auto不能被修飾為模板引數
上面舉的這個例子很簡單,在真正程式設計的時候也不建議這樣來使用auto,直接寫出變數的型別更加清晰易懂。下面列舉auto關鍵字的正確用法。
想象一下在沒有auto的時候,我們操作標準庫時經常需要這樣:
#include#includeint main()
}
這樣看**寫**實在煩得很。有人可能會說為何不直接使用using namespace std,這樣**可以短一點。實際上這不是該建議的方法(c++primer對此有相關敘述)。使用auto能簡化**:
#include#includeint main()
}
for迴圈中的i將在編譯時自動推導其型別,而不用我們顯式去定義那長長的一串。
decltype關鍵字和auto相互對應的,它們經常在一些場所配合使用。decltype可以在編譯的時候判斷出乙個變數或者表示式的型別,例如:
#include #include #include using namespace std;
void func(auto can)
int main()
這裡decltype拿到了num的型別,然後用這個型別定義了num2做了num的乙份copy。
auto a4 = 10, a5 = 20, a6 = 30;//正確
auto b4 = 10, b5 = 20.0, b6 = 'a';//錯誤,沒有推導為同一型別
使用auto關鍵字做型別自動推導時,依次施加一下規則:
int a = 10;
int &b = a;
auto c = b;//c的型別為int而非int&(去除引用)
auto &d = b;//此時c的型別才為int&
c = 100;//a =10;
d = 100;//a =100;
const int a1 = 10;
auto b1= a1; //b1的型別為int而非const int(去除const)
const auto c1 = a1;//此時c1的型別為const int
b1 = 100;//合法
c1 = 100;//非法
const int a2 = 10;
auto &b2 = a2;//因為auto帶上&,故不去除const,b2型別為const int
b2 = 10; //非法
這是因為如何去掉了const,則b2為a2的非const引用,通過b2可以改變a2的值,則顯然是不合理的。
int a3[3] = ;
auto b3 = a3;
cout << typeid(b3).name() << endl;
程式將輸出
int *
int a7[3] = ;
auto & b7 = a7;
cout << typeid(b7).name() << endl;
程式輸出
int [3]
void func(auto a) //錯誤
cout << sizeof(auto) << endl;//錯誤
cout << typeid(auto).name() << endl;//錯誤
C auto 關鍵字的使用
c auto 關鍵字的使用 早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期 int a 10 擁有自動生命期 auto int b 20 擁有自動生命期 static in...
C auto 關鍵字的使用
早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期 int a 10 擁有自動生命期 auto int b 20 擁有自動生命期 static int c 30 延長了生命期 ...
C auto關鍵字用法
c 98 auto 早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期 int a 10 擁有自動生命期 auto int b 20 擁有自動生命期 static int c ...