C 11新特性 auto關鍵字

2021-09-12 23:16:44 字數 2438 閱讀 2544

熟悉指令碼語言的人都知道,很多指令碼語言都引入了「型別自動推斷」技術:比如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;

templatevoid add(t t, u u)

int main()

type of a is int

type of s is char const * __ptr64

type of iter is class std::_vector_iterator> >

type of t + u is double

在這種情況下,auto主要與decltype關鍵字配合使用,作為返回值型別後置時的佔位符。此時,關鍵字不表示自動型別檢測,僅僅是表示後置返回值的語法的一部分。

示例如下:

templateauto 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關鍵字

熟悉指令碼語言的人都知道,很多指令碼語言都引入了 型別自動推斷 技術 比如python,可以直接宣告變數,在執行時進行型別檢查。隨著c 11標準的發布,c 語言也引入了型別自動推斷的功能,這就是我們今天要介紹的auto關鍵字。c 是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我...

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...