【C++11新特性】 auto關鍵字


原文鏈接: http://blog.csdn.net/xiejingfa/article/details/50469045

 

熟悉腳本語言的人都知道,很多腳本語言都引入了“類型自動推斷”技術:比如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 <iostream> #include <vector> using namespace std; template<class T, class U> void add(T t, U u) { auto s = t + u; cout << "type of t + u is " << typeid(s).name() << endl; } int main() { // 簡單自動類型推斷 auto a = 123; cout << "type of a is " << typeid(a).name() << endl; auto s("fred"); cout << "type of s is " << typeid(s).name() << endl; // 冗長的類型說明(如迭代器) vector<int> vec; auto iter = vec.begin(); cout << "type of iter is " << typeid(iter).name() << endl; // 使用模板技術時,如果某個變量的類型依賴於模板參數,使用auto確定變量類型 add(101, 1.1); }

函數返回值占位符

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

示例如下:

template<class T, class U> auto add(T t, U u) -> decltype(t + u) { return 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和引用類型,除非顯示聲明。例如:

  • 使用auto關鍵字進行類型推導時,如果初始化表達式是引用類型,編譯器會去除引用,除非顯示聲明。例如:
    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
  • 使用auto使用auto關鍵字進行類型推導時,編譯器會自動忽略頂層const,除非顯示聲明。例如:
    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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM