熟悉指令碼語言的人都知道,很多指令碼語言都引入了「型別自動推斷」技術:比如python,可以直接宣告變數,在執行時進行型別檢查。隨著c++11標準的發布,c++語言也引入了型別自動推斷的功能,這就是我們今天要介紹的auto關鍵字。
c++是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我們很難推斷出某個表示式的值的型別,尤其是隨著模板型別的出現,要想弄明白某些複雜表示式的返回型別就變得更加困難。為了解決這個問題,c++11重新定義了auto關鍵字的語義,用於進行自動型別推斷。為什麼說「重新定義」呢?auto關鍵字在c++98中已經出現,用於自動變數的宣告,但是極少被使用(關於此定義,可以檢視這裡)。
c++引入auto關鍵字主要有兩種用途:一是在變數宣告時根據初始化表示式自動推斷該變數的型別,二是在宣告函式時作為函式返回值的佔位符。對於自動型別推斷,c++11中也有乙個類似的關鍵字decltype,感興趣的童鞋可以繼續關注我的部落格,今天我們主要來講解一些auto關鍵字的用法。
使用auto從初始化表示式中推斷出變數的資料型別,可以大大簡化我們的程式設計工作,特別是對於一些型別冗長複雜的變數。比如,在以前的做法中,對於vector型別的變數,如果我們需要獲取它的迭代器,我們需要這樣宣告vector::iterator iter,而使用auto關鍵字後我們可以讓編譯器幫我們推斷出迭代器的具體型別。另外,在模板函式定義時,如果變數的型別依賴於模板引數,我們也很難確定變數的型別,使用auto關鍵字則可以把這些「髒活累活」交給編譯器完成。
下面看一些簡單的例子:
#include
#include
using
namespace
std;
template
void add(t t, u u)
int main()
在這種情況下,auto主要與decltype關鍵字配合使用,作為返回值型別後置時的佔位符。此時,關鍵字不表示自動型別檢測,僅僅是表示後置返回值的語法的一部分。
示例如下:
templatet, class
u>
auto add(t t, u u) -> decltype(t + u)
1、使用auto關鍵字的變數必須有初始值。
2、可以使用valatile,*(指標型別說明符),&(引用型別說明符),&&(右值引用)來修飾auto關鍵字。
auto a = 10;
auto *pa = new
auto(a);
auto **rpa = new
auto(&a);
cout
<< typeid(a).name() << endl; // 輸出: int
cout
<< typeid(pa).name() << endl; // 輸出: int *
cout
<< typeid(rpa).name() << endl; // 輸出: int **
3、函式引數和模板引數不能被宣告為auto。
4 、使用auto關鍵字宣告變數的型別,不能自動推導出頂層的cv-qualifiers和引用型別,除非顯示宣告。例如:
int i = 10;
int &r = i;
auto a = r;
a = 13; // 重新賦值
cout
<< "i = "
<< i << " a = "
<< a << endl; // 輸出i=10,a=13
// 顯式宣告
auto &b = r;
b = 15; // 重新賦值
cout
<< "i = "
<< i << " b = "
<< b << endl; // 輸出i=15,a=15
const
int c1 = 10;
auto c2 = c1;
c1 = 11; // 報錯,c1為const int型別,無法修改const變數
c2 = 14; // 正確,c2為int型別
// 顯示宣告
const
auto c3 = c1;
c3 = 15; // 報錯,c3為const int型別,無法修改const變數
5、對於陣列型別,auto關鍵字會推導為指標型別,除非被宣告為引用。例如:
int a[10];
auto b = a;
cout
<< typeid(b).name() << endl; // 輸出:int *
auto &c = a;
cout
<< typeid(c).name() << endl; // 輸出:int [10]
C 11新特性 auto關鍵字
在c 98標準中就存在著auto關鍵字,c 98標準中auto關鍵字用於自動變數的宣告,但在預設情況下即使不宣告auto,函式內部的變數也是具有自動儲存期的。因此由於使用極少且多餘,在c 11中已刪除這一用法。void fun c 11新標準引入了auto型別說明符,採用它可以讓編譯器幫助我們分析表...
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 是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我...