在我們程式設計時候常常需要把表示式的值賦給變數,需要在宣告變數的時候清楚的知道變數是什麼型別。然而做到這一點並非那麼容易(特別是模板中),有時候根本做不到。
為了解決這個問題,c++11新標準就引入了auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別。和原來那些只對應某種特定的型別說明符(例如 int)不同。auto 讓編譯器通過初始值來進行型別推演。從而獲得定義變數的型別,所以說 auto 定義的變數必須有初始值。因此auto並非是一種「型別」的宣告,而是乙個型別宣告時的「佔位符」,編譯器在編譯期會將auto替換為變數實際的型別。
auto關鍵字:
1、在擁有初始化表示式的複雜型別變數宣告時的簡化:
//在擁有初始化表示式的複雜型別變數宣告時的簡化
void testauto()
; std::vector::iterator it = v.begin();
while (it != v.end())
cout << *it++ << " ";
cout << endl;
for (auto it = v.begin(); it != v.end(); ++it)
cout << *it << " ";
cout << endl;
}int main()
2、免除程式設計師在一些型別宣告時的麻煩,或者避免一些在型別宣告時的錯誤:
int main()
3、 auto的自適應性能夠在一定程度上支援泛型程式設計:
//auto的自適應性能夠在一定程度上支援泛型程式設計
templatedouble add(const t1& left, const t2& right)
int main()
結果如圖:
4、auto和指標一起使用的時候:
//auto和指標一起使用的時候
int main()
c++11中vector的簡單應用:
//vector的初始化
int main()
;//初始化列表(c++11)
vectorvd = ;
vectorve(va.begin(), va.end());//迭代器指定範圍初始化
return 0;
}//利用拷貝建構函式和swap函式可以實現賦值操作
int main()
; for (int i = 0; i < 10; i++)
va = vb;//vb拷貝給va
swap(va, vc);
for (auto x : vc)//輸出應該是va裡面的值
cout <> vvb(4, );
for (int i = 0; i != vvb.size(); i++)
for (auto bit = vvb.begin(); bit != vvb.end(); bit++)
system("pause");
return 0;
}//c++11中vector遍歷:
decltype推導的四個規則:
1、如果e是乙個沒有帶括號的標記符表示式或者類成員訪問表示式,那麼decltype(e)就是e所命名的實體的型別。此外如果e是乙個被過載的函式,則會編譯失敗。
2、標記符表示式:單個標記符對應的表示式即為標記符表示式。(除去關鍵字、字面常量等編譯器需要用到的標記)比如:int arr[3];arr為標記符表示式,但是arr[0] + 3和arr[3]就不是。
3、否則,假設e的型別是t,如果e是將亡值(比如臨時變數或者函式區域性變數)decltype(e)被推導為t&&,否則,假設e的型別是t,如果e是乙個左值,則decltype(e)為t的引用。否則,假設e的型別是t,則decltype(e)為t。
C 11 auto自動型別推導
1.auto型別推導auto x 5 正確,x是int型別 auto pi new auto 1 正確,批是int const auto v x,u 6 正確,v是const int 型別,u是const int static auto y 0.0 正確,y是double型別 auto int r ...
C 11 auto型別推斷和decltype
1.auto型別推斷 a.引入原因 程式設計時,經常需要將表示式的值賦給變數,這就要求我們在申明變數的時候,明確知道表示式的型別,然而要做到這一點並不容易,於是引入auto讓編譯器幫我們去做型別分析。b.使用注意事項const int const i 1,const ref const i auto...
C 11 auto和decltype關鍵字
可以用 auto 關鍵字定義變數,編譯器會自動判斷變數的型別。例如 auto i 100 i 是 int auto p new a p 是 a auto k 34343ll k 是 long long有時,變數的型別名特別長,使用 auto 就會很方便。例如 map mp for auto i mp...