深入浅出c++11之auto

    科技2022-07-14  113

    1.首先这是一个关键字,这是C++ 语法决定的! auto这个关键字其实在很早的 c++版本就有了,好像是c++98 ,那时的功能很简单,就是表示一个变量的自动生命周期,中间版本又去掉了,但c++11以重新开放出来了,作用已经完全不同了,(你可以理解成字是一样,要表达的功能完全不一样了) 并且重新定义了其功能,变得更强大了!

    作用:编译器推导变量的数据类型!

    auto的自动类型推断发生在编译期 ! 这个很重要,圈起来!

    为什么要引入引功能?

    C++11 应该是参考了其实一些语言的特性如C#,python,java script ,可能就是感觉别的语言这个功能感觉很爽,

    自己是不是也得整一下,不然不太low了! 

    其它语言这样:   var testval=90;

    比如我们现在经常使用:定义一个临时变量

    auto  abc =6;

    auto  test=func();

    auto使用限制

    1.不能作为函数参数

    2.不能用于静态成员变量

    3.不能用来定义数组

    4.不能用来声明或定义为模板参数

    5.不能用于sizeof/typeid操作

    6.auto变量 推导类型前后必须一致,比如你定义推导整型, 就是使用后,不要一会推整型,一会又推浮点型,这

    是不支持的!

    7. auto不能与其他类型组合连用

    如:auto int abc =5;  这样肯定不行

    auto 使用场景:

    1.

    before: std::vector<int> vs; std::vector<int> ::iterator it ; for (it = vs.begin(); it != vs.end(); it++) { //.. } auto: std::vector<int> vs; for (auto i = vs.begin(); i != vs.end(); i++) { //.. }

    这样写是不是简便很多,当然使用forearch就更简便了!

    2.   

    在定义模板函数时,用于声明依赖模板参数的变量类型。

    template <typename _Tx,typename _Ty> void Add(_Tx x, _Ty y) { auto sum = x+y; }

    3.

    模板函数依赖于模板参数的返回值

    template <typename _Tx, typename _Ty> auto Add(_Tx x, _Ty y)->decltype(x+y) { return x+y; }

    c++ 14已经支持下面这样写了,可以去掉 ->decltype(x+y)   c++ 11必须要 decltype  template <typename _Tx, typename _Ty> auto Add(_Tx x, _Ty y) {     return x+y; }

    说明一下: 只能说c++11在这个功能上还不是特别强,当模板函数的返回值依赖于模板的参数时,我们无法在编译代码前确定模板参数的类型,所以无法得知返回值的类型,所以c++ 11 又想出了一招,在后面加decltype操作符, decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,通过decltype(x+y)这个延迟推导,auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(_Tx+_Ty), 当然c++14 又做了优化了,这里就不作多介绍,假如你使用的编辑器支持更高的c++标准,你也可以采用c++14这样写,更简单直观!

    使用时注意事项

    1、使用auto关键字的变量必须有初始值。

    2.对于数组类型,auto关键字会推导为指针类型,除非被声明为引用。例如:

    int a[10]; auto b = a; cout << typeid(b).name() << endl; // 输出:int * auto &c = a; cout << typeid(c).name() << endl; // 输出:int [10]

    3.auto 型变量不跟随引用类型,除非你显式声明才跟随

    int itest = 100; int &r = itest; auto autoetst = r; a = 130; // 重新赋值 // 输出itest =100,autoetst =130 cout << "itest = " << itest << " autoetst = " << autoetst << endl; // 显式声明 auto &rb = r; rb = 15; // 重新赋值 cout << "itest = " << itest << "rb = " << rb << endl; // 输出itest=15,rb=15

    4.auto 型变量不跟随const类型,除非你显式声明才跟随

    const int c1 = 10; auto c2 = c1; c2 = 14; // 正确,c2为int类型,可以修改它的值 // 显示声明 const auto c3 = c1; c3 = 15; // 报错,c3为const int类型,无法修改const变量 keivin2006 认证博客专家 C/C vc/qt 音视频 一名c/c++/vc/qt 的小学生,“精通”c,“精通”c++,“精通”vc++,“精通”php,“精通”qt,“精通”java,“精通”python,“精通”c#,“精通”...! 编不下去了,只要见过名字的都我“精通”....为哈,因为我现在是csdn“砖家”了!本人qq: 88520350 qq学习群:930432714 (C/C++/QT/VC学习交流群) 海量学习资料都分享在群里指点学习方向,掌握学习要点,快速提高技术水平, 技术分享,共同学习!
    Processed: 0.020, SQL: 8