条款二 了解auto类型推断

基础知识

除了一处例外,auto的类型推断与template一样。存在一个直接的从template类型推断到auto类型推断的映射

三类情况下的推断如下所示:

// case 1
const auto& rx = x; // rx -> int // case 2
auto&& uref1 = x; // uref1 -> int&
auto&& uref2 = cx; // uref2 -> const int&
auto&& uref3 = ; // uref3 -> int&& // case 3
auto x = ; // x -> int
const auto cx = x; // x -> int

对于数组和函数,有如下推断:

const char name[] = "R. N. Briggs";
auto arr1 = name; // arr1 -> const char*
auto& arr2 = name; // arr2 -> const char(&)[13] void someFunc(int, double);
auto func1 = someFunc; // func1 -> void (*)(int, double)
auto& func2 = someFunc; // func2 -> void (&)(int, double)

但是在使用初始化列表(std::initializer_list)的情况下,auto的类型推断会有问题

auto x = ; // x1 -> int
auto x2(); // x2 -> int
auto x3 = {}; // x3 -> std::initializer_list<int>
auto x4{}; // x4 -> std::initializer_list<int>

列表初始化是auto与template类型推断的唯一区别,template函数推断中不能使用列表形式的初始化{}

auto x = {, , };
template<typename T>
void f(T param);
f({, , }); // wrong! template<typename T>
void f(std::initializer_list<T> initList);
f({, , }); // T -> int, initList -> std::initializer_list<int>

C+14可以使用auto来推断函数返回类型,并且lambda可以在形参声明中使用auto,但是此处的auto使用template类型推断而非auto类型推断,所以返回列表初始化将报错

auto createInitList() {
return {, , };
} // error! std::vector<int> v;
auto resetV = [&v](const auto& newValue) {v = newValue};
resetV({, , }) // error!

总结

  • auto类型推断总是和template类型推断一样,但是auto类型推断把列表初始化解析成std::initializer_list,template类型推断则不然
  • 在函数返回类型以及lambda形参中的auto,采用template类型推断而非auto类型推断

最新文章

  1. Mac--10.8.3下使用apache2方法
  2. 总结/PSP初体验—排球计分程序1.0
  3. 遗传算法在JobShop中的应用研究(part 6:结果显示)
  4. ANE原生代码的调试(安卓)
  5. ARMv7 ldr/str指令详解
  6. SQLite 在Windows Server 2008 R2 部署问题FAQ汇总[轉]
  7. VS2012中使用纯C实现COM的小问题
  8. PYTHON线程知识再研习B
  9. 查看Oracle有哪些表或者视图
  10. [QT Creator]LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 。
  11. 《Hexo+github搭建个人博客》
  12. Tp3.2提交表单与操作表单
  13. tomcat The specified JRE installation does not exist
  14. SAS中常见的数组函数
  15. web开发前端面试知识点目录整理
  16. 3D数学基础(三)矩阵
  17. Django——User-Profile
  18. SQL Server 2016新特性:Temporal Table
  19. 大话前端解析Json对象
  20. asp.net 如何判断输入的值 包括 汉字?

热门文章

  1. 关于iOS9之后的loadViewIfNeeded
  2. iOS-OC-基础-NSArray常用方法
  3. ios 异步多线程 获取数据
  4. OpenCV——写手势识别碰到的各种错误
  5. wxPython缩放图片控件的一个小例子
  6. (转)Java程序利用main函数中args参数实现参数的传递
  7. VLC的相关文档以及javascript接口
  8. Tomcat学习笔记 - 错误日志 - Tomcat安装版安装后第二次启动后闪退(转)-- javac不是内部或外部命令 -- 配置java环境教程
  9. li浮动引起ul高度坍陷的解决方法
  10. vs2003的代码考到vs2010 会出现(Windows CR LF)