【C++面试篇】自动类型推导

438 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

C++11提供了两种自动类型推导:auto和decltype,这是C++11的新特性,也是面试中的常考问题。

二者是使用上有一些明显的不同需要区分,避免在使用的过程中出现问题。下面将对二者进行详细的介绍,同时会介绍C++14新增的类型指示符decltype(auto)

auto

编译器根据初始值推算变量的类型

auto只是一个占位符,在编译期间被真正的类型替代

img

规则:

  • auto总是推导出值类型,不会推导出引用类型
  • auto&&是特殊用法,总是推导出引用类型
  • C++过于复杂,自动类型推导可能有时候失效,得不到想要的结果,如str,C++14可以使用s显示标识字符串auto str = "hello"s;
  • 使用了花括号初始化列表,最后存储为什么类型比较合适,编译器无法知道
  • 类成员变量初始化时C++标准目前还不支持自动类型推导
  • auto可以附加const/volatile/*/&等类型修饰符

decltype

分析并获得表达式的类型,但不实际使用表达式的值初始化

img

规则

  • 不论是顶层const还是底层const, decltype都会保留
  • 如果表达式是引用类型, 那么decltype的类型也是引用
  • 如果表达式是引用类型, 但是想要得到这个引用所指向的类型, 需要修改表达式
  • 对指针的解引用操作返回的是引用类型
  • 如果一个表达式的类型不是引用, 但是我们需要推断出引用, 那么可以加上一对括号, 就变成了引用类型了
  • 可以附加const/volatile/*/&等类型修饰符

decltype(auto)

这是C++14新增的类型指示符,可以用于声明变量以及指示函数返回类型

在使用时将=左边的表达式替换掉auto,再根据decltype的语法规则确定类型

img

img