类型推导
1. auto
auto可以让编译器在编译期间就推导出变量的类型
(1) auto的使用必须马上初始化,否则无法推导出类型
(2) auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败
(3) auto不能用作函数参数
(4) 在类中auto不能用作非静态成员变量
(5) auto不能定义数组,可以定义指针
(6) auto无法推导出模板参数
(7) 在不声明为引用或者指针时,auto会忽略等号右边的引用类型和cv限定
(8) 在声明为引用或者指针时,auto会保留等号右边的引用和cv属性
2. decltype
decltype用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算
decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属性
对于decltype(exp)有:
- exp是表达式,decltype(exp)和exp类型相同
- exp是函数调用,decltype(exp)和函数返回值类型相同
- 其他情况,若exp是左值,decltype(exp) 是exp类型的左值引用
auto 和 decltype 的配合使用:
template<typename T, typename U>
auto add(T t,U u) -> decltype(t + u) {
return t + u;
}