C++11/14介紹(二)——語言可用性的強化(二)

類型推導

  • 在傳統C/C++中,任何參數的類型都必須明確定義,這會使開發效率變慢,而且讓代碼變得冗長
  • C++11引入了autodecltype實現了類型推導

一、auto

  • 使用auto進行類型推導的一個最爲常見而且顯著的例子就是迭代器,以前需要這樣寫:

    for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)
    

    有了auto之後可以:

    for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr)
    
  • auto常見用法

    auto i = 5;	//auto被推導爲int
    auto arr = new auto(10);  //auto被推導爲int *
    
  • auto不可以用於函數傳參,如下用法在C++11中是錯誤的

    int add(auto x, auto y)
    {
        return x+y;
    }
    int main()
    {
        cout<<add(5,6);
        return 0;
    }
    

    不過在C++14中可以正常編譯通過

    int add(auto x, auto y)
    {
        return x+y;
    }
    int main()
    {
        cout<<add(5,6);
        return 0;
    }
    

    輸出

    11
    
  • auto不能用與推導數組類型

    int main()
    {
        int arr[10] = {0};
        auto auto_arr = arr;
        auto auto_arr2[10] = arr;   //錯誤
        cout<<*auto_arr2;
        return 0;
    }
    

二、decltype

  • auto關鍵字只能對變量進行類型推導,decltype用法和sizeof很相似

    int main()
    {
        auto x = 1;
        auto y = 2;
        decltype(x+y) z; //推導結果爲int。z的類型爲int。
        return 0;
    }
    
  • 如果需要寫一個模板函數實現加法運算,你可能需要這樣寫:

    template<typename R, typename T, typename U>
    R add(T x, U y) {
        return x+y;
    }
    
    int main()
    {
        cout<<add<int,int> (1,2);
        return 0;
    }
    

    這樣寫會顯得很冗長,複雜,在C++11中,可以寫成如下形式:

    template<typename T, typename U>
    auto add(T x, U y) -> decltype(x+y) {
        return x+y;
    }
    int main()
    {
        cout<<add<int,int> (1,2);
        return 0;
    }
    

    當然,在C++14中,可以寫的更精簡:

    template<typename T, typename U>
    auto add(T x, U y) {
        return x+y;
    }
    int main()
    {
        cout<<add<int,int> (1,2);
        return 0;
    }
    

    或者乾脆去掉模板:

    auto add(auto x, auto y) {
        return x+y;
    }
    int main()
    {
        cout<<add(1.1,2);
        return 0;
    }
    
  • 參考:C++ 11/14 高速上手教程 - 語言可用性的強化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章