C++ 11 學習1:類型自動推導 auto和decltype


Cocos 3.x 用了大量的C++ 11 的東西,所以作為一個C++忠實粉絲,有必要對C++ 11進行一個系統的學習。

使用C++11之前,一定要注意自己使用的編譯器對C++11的支持情況,有些編譯器並不是完全支持,比如我正在使用的vs2012。這里是msdn里面VS各版本對C++ 11 的支持 對 C++11 功能的支持(現代 C++)

 

1.auto

auto這個關鍵字C++原先就有,用來指定存儲器。因為很少有人去用這個東西,所以在C++11中就把原有的auto功能給廢棄掉了,而變成了現在的類型推導關鍵字。先說下auto的簡單用法:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main() {
    auto num = 1;  //num 是int類型
    auto c = 'A'; //c 是char類型
    auto str("test"); // str是char數組
    
    map<string, vector<int>> map;
    for(auto it = begin(map); it != end(map); ++it)  // it 為迭代器類型
    {
    }

    return 0;
}

這樣使用最明顯的好處就是在使用迭代器遍歷STL容器的時候,不用去聲明那些迭代器的類型,也不用去使用typedef就能很簡潔的實現遍歷了。

從效率上來說,auto不會對運行時效率產生影響,它是在編譯的時候推導類型的,例如上面的代碼,編譯的時候,就會把num變量轉換為int類型。

auto和其他變量類型有明顯的區別:

1.auto聲明的變量必須要初始化,否則編譯器不能判斷變量的類型。

2.auto不能被聲明為返回值,auto不能作為形參,auto不能被修飾為模板參數

3.

2.decltype

decltype關鍵字和auto相互對應的,它們經常在一些場所配合使用。decltype可以在編譯的時候判斷出一個變量或者表達式的類型,例如:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

void func(auto can) {
    int a;
}

int main() {
    auto num = 1;  //num 是int類型
    decltype(num) num2 = num; //num2 也是int類型

    return 0;
}

這里decltype拿到了num的類型,然后用這個類型定義了num2做了num的一份copy。auto和decltype還有一種經典的使用場合,看下面例子:

template <typename T1, typename T2>  
auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)  
{  
   return t1+t2;  
}

這里是用一個模板來計算兩個變量的加法,如果兩個類型T1和T2不一樣的話,t1+t2的類型將由編譯器來決定,這樣使用decltype就可以拿到返回的類型。但是如果把decltype(t1 + t2)放到函數命名的前面作為返回值的話,按照編譯器的解析順序,當解析到返回值decltype(t1 + t2)的時候t1和t2還沒有被定義,所以要重新聲明t1和t2的類型,這樣就會變的很復雜很難讀懂。

於是C++11就改變了語法規則,把decltype(t1 + t2)放到函數的后方,並用auto作為返回值來告訴編譯器,真正的返回值在函數聲明之后。簡單的說auto可以作為返回值占位符來使返回值后置。

 


免責聲明!

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



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