auto型別

愛上冰激凌發表於2018-07-17

auto的限制

auto不能用於函式引數;不支援auto型別非靜態成員初始化;auto無法定義陣列;auto無法推匯出模板型別。

void func(auto k = 1);  //auto不能用於函式引數

struct Foo 
{
    auto var1_ = 0;     //auto不能用於非靜態成員
    static const auto var2_ = 0;
};

template<typename T>
struct Bar{};


int main()
{
    int x = 5;

    auto y = x; //auto->int,y->int

    auto *a = &x;   //auto->int, a->int*

    auto b = &x;    //auto->int *, b->int*

    auto &c = x;    //auto->int; c->int&

    auto d = &c;    //auto->int*; d->int *

    const auto& g = x;  //auto->int&; g->const int&

    auto h = g; //auto->const int&; h->const int&
    //當申明指標或者引用時,auto的推導結果將保持初始化表示式的cv屬性

    int arr[10] = { 0 };    
    auto cpArr = arr;   //auto->int *;cpArr->int *

    auto nextArr[10];   //auto無法定義陣列

    Bar<int> bar;
    Bar<auto> bb = bar;   //auto無法推匯出模板型別

    return 0;

}

auto的應用
1.無法知道變數應該被定義成什麼 型別。

class  Foo
{
public:
    static int get()
    {
        return 0;
    }
};

class Bar
{
public:
    static const char* get()
    {
        return "0";
    }
};

template<typename T>
func<T>()
{
    auto val = T::get();

}
int main()
{
    func<Foo>();
    func<Bar>();

    return 0;
}

2.簡化變數宣告型別

int main()
{
    std::map<double, double> resultmap;

    std::map<double, double>::iterator it = resultmap.begin();

    for (; it != resultmap.end(); it++)
    {
        //do something
    }
    return 0;
}

上述程式碼中it的型別其實通過resultmap.begin()即可知道,因此宣告可以簡化如下

int main()
{
    std::map<double, double> resultmap;

    /*std::map<double, double>::iterator it = resultmap.begin();*/

    for (auto it = resultmap.begin() ;it != resultmap.end(); it++)
    {
        //do something
    }
    return 0;
}

相關文章