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 高速上手教程 - 语言可用性的强化

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