std::auto (c++11)

2019-05-28  本文已影响0人  allenyang羊羊

使用auto关键字定义变量时,编译器会自动根据上下文情况,确定auto变量的真正类型,在写for循环和stl迭代类型时非常有用。

    std::vector<std::string> vs;
    for (auto i = vs.begin(); i != vs.end(); i++)
    {
        //..
    }
    //在定义模板函数时,用于声明依赖模板参数的变量类型。
    template <typename _Tx,typename _Ty>
    void Multiply(_Tx x, _Ty y)
    {
        auto v = x*y;
        std::cout << v;
    }

注意事项

    auto a4 = 10, a5 = 20, a6 = 30;//正确
    auto b4 = 10, b5 = 20.0, b6 = 'a';//错误,没有推导为同一类型

使用auto关键字做类型自动推导时,依次施加以下规则:

    int a = 10;
    int &b = a;
 
    auto c = b;//c的类型为int而非int&(去除引用)
    auto &d = b;//此时c的类型才为int&
 
    c = 100;//a =10;
    d = 100;//a =100;
    const int a1 = 10;
    auto  b1= a1; //b1的类型为int而非const int(去除const)
    const auto c1 = a1;//此时c1的类型为const int
    b1 = 100;//合法
    c1 = 100;//非法
    const int a2 = 10;
    auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
    b2 = 10; //非法

这是因为如何去掉了const,则b2为a2的非const引用,通过b2可以改变a2的值,则显然是不合理的。

    int a3[3] = { 1, 2, 3 };
    auto b3 = a3;
    cout << typeid(b3).name() << endl;

程序将输出

int *
    int a7[3] = { 1, 2, 3 };
    auto & b7 = a7;
    cout << typeid(b7).name() << endl;

程序输出

int [3]
void func(auto a)  //错误
{
    //... 
}
    cout << sizeof(auto) << endl;//错误
    cout << typeid(auto).name() << endl;//错误
上一篇 下一篇

猜你喜欢

热点阅读