转自 http://blog.csdn.net/huang_xw/article/details/8760403

C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。

1. 自动类型推断

auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。下面是一些使用auto的例子。

[cpp] view plaincopyprint?
  1. #include <vector>
  2. #include <map>
  3. using namespace std;
  4. int main(int argc, char *argv[], char *env[])
  5. {
  6. //  auto a;                 // 错误,没有初始化表达式,无法推断出a的类型
  7. //  auto int a = 10;        // 错误,auto临时变量的语义在C++11中已不存在, 这是旧标准的用法。
  8. // 1. 自动帮助推导类型
  9. auto a = 10;
  10. auto c = 'A';
  11. auto s("hello");
  12. // 2. 类型冗长
  13. map<int, map<int,int> > map_;
  14. map<int, map<int,int>>::const_iterator itr1 = map_.begin();
  15. const auto itr2 = map_.begin();
  16. auto ptr = []()
  17. {
  18. std::cout << "hello world" << std::endl;
  19. };
  20. return 0;
  21. };
  22. // 3. 使用模板技术时,如果某个变量的类型依赖于模板参数,
  23. // 不使用auto将很难确定变量的类型(使用auto后,将由编译器自动进行确定)。
  24. template <class T, class U>
  25. void Multiply(T t, U u)
  26. {
  27. auto v = t * u;
  28. }

2. 返回值占位

[cpp] view plaincopyprint?
  1. template <typename T1, typename T2>
  2. auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)
  3. {
  4. return t1+t2;
  5. }
  6. auto v = compose(2, 3.14); // v's type is double

3.使用注意事项

①我们可以使用valatile,pointer(*),reference(&),rvalue reference(&&) 来修饰auto

[cpp] view plaincopyprint?
  1. auto k = 5;
  2. auto* pK = new auto(k);
  3. auto** ppK = new auto(&k);
  4. const auto n = 6;

②用auto声明的变量必须初始化

[cpp] view plaincopyprint?
  1. auto m; // m should be intialized

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

[cpp] view plaincopyprint?
  1. auto int p; // 这是旧auto的做法。

④函数和模板参数不能被声明为auto

[cpp] view plaincopyprint?
  1. void MyFunction(auto parameter){} // no auto as method argument
  2. template<auto T> // utter nonsense - not allowed
  3. void Fun(T t){}

⑤定义在堆上的变量,使用了auto的表达式必须被初始化

[cpp] view plaincopyprint?
  1. int* p = new auto(0); //fine
  2. int* pp = new auto(); // should be initialized
  3. auto x = new auto(); // Hmmm ... no intializer
  4. auto* y = new auto(9); // Fine. Here y is a int*
  5. auto z = new auto(9); //Fine. Here z is a int* (It is not just an int)

⑥以为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid

[cpp] view plaincopyprint?
  1. int value = 123;
  2. auto x2 = (auto)value; // no casting using auto
  3. auto x3 = static_cast<auto>(value); // same as above

⑦定义在一个auto序列的变量必须始终推导成同一类型

[cpp] view plaincopyprint?
  1. auto x1 = 5, x2 = 5.0, x3='r';  // This is too much....we cannot combine like this

⑧auto不能自动推导成CV-qualifiers(constant & volatile qualifiers),除非被声明为引用类型

[cpp] view plaincopyprint?
  1. const int i = 99;
  2. auto j = i;       // j is int, rather than const int
  3. j = 100           // Fine. As j is not constant
  4. // Now let us try to have reference
  5. auto& k = i;      // Now k is const int&
  6. k = 100;          // Error. k is constant
  7. // Similarly with volatile qualifer

⑨auto会退化成指向数组的指针,除非被声明为引用

[cpp] view plaincopyprint?
  1. int a[9];
  2. auto j = a;
  3. cout<<typeid(j).name()<<endl; // This will print int*
  4. auto& k = a;
  5. cout<<typeid(k).name()<<endl; // This will print int [9]

转载于:https://www.cnblogs.com/ph829/p/4597044.html

【C++11】新特性——auto的使用相关推荐

  1. C++11新特性——auto和decltype

    一.auto和decltype 1.auto和decltype都是C++11新增的关键字,都用于类型自动推导. 类型格式 auto varname = value; //auto的语法格式 declt ...

  2. C++11新特性的总结

    C++11新特性 auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11) C++动态内存管理 序列式容器 array forward_list; 继承和 ...

  3. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性

    C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...

  4. 【C++面试宝典】C++11新特性知识总结

    目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...

  5. C++11新特性之auto关键字的使用

    一.auto关键字简介 auto这个关键字并不是一个全新的关键字,在旧标准中,它代表的是"具有自动存储期的局部变量":但是它在这方面并没有起到很大的作用,比如:auto int i ...

  6. 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)

    C++11 重要新特性 auto decltype nullptr 快速遍历与数组初始化 Lambda 表达式 Lambda 应用 外部变量捕获 mutable auto 可以从初始化表达式中推断出变 ...

  7. C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...

  8. C++11新特性decltype

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105042574 C ...

  9. 深入浅出之C++11新特性

    1. auto类型赋予新含义 1.1 auto类型定义 在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的,这也是编译 ...

  10. 《深入理解C++11:C++ 11新特性解析与应用》——导读

    前 言 为什么要写这本书 相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了.而上一次标准制定,正是面向对象概念开始盛行的时候.较之基于过程的编程语言,基于面向对象.泛型编程等概念的C ...

最新文章

  1. Mac下安装Pyqt
  2. 剑指Offer系列 重建二叉树
  3. 排球比赛计分规则功能说明书
  4. 怎么让qt发声_第3部分:添加网络字体-让我们的单词发声
  5. springBoot修改代码不需要重启-热部署
  6. python网络爬虫系列(九)——打码平台的使用
  7. 计算机教师专业发展规划,信息技术教师成长规划_信息技术教师专业成长浅谈...
  8. 解决Java在请求某些不受信任的https网站时会报:PKIX path building failed
  9. 华为的人才体系:任正非这样管理19万员工
  10. Qt之打印pdf文档
  11. 跟着 Cell 学作图 | 火山图进阶版
  12. java setw_C++ setw:格式化输出(详解版)
  13. 全国计算机等级考试有java吗,请问全国计算机等级考试有没有二级Java?
  14. charles入门使用
  15. 送书 |《Python数据分析从小白到专家》
  16. k阶子式、主子式、顺序主子式、余子式、代数余子式
  17. latex 加减号堆积,放在一起
  18. 降维的基本知识点总结
  19. CSRF---跨站请求伪造
  20. 男子取己击架后患净癖怪病 1地用12舒卫生纸

热门文章

  1. Makefile模板的继续改进
  2. ubuntu系统4G卡上网操作图解
  3. 双向链表list.h升序排序
  4. php数组转化js数组格式化,php数组转换成js数组
  5. 为啥我从后台查到的值在页面显示的是undefined_【java笔记】046天,作购物车页面,学习JavaScript...
  6. 95-30-017-Channel-NioServerSocketChannel
  7. 【ambari】Ambari 环境安装
  8. 【Kafka】kafka 监控指标项
  9. 【Scala】Scala Java Error: value filter is not a member of *
  10. hortonworks/registry配置详解