解释类型推导如何工作,auto是如何依赖模板类型推导的,以及decltype独特工作规则。
1.理解模板(template)类型推导
针对以上代码的三种情况讨论
1. paramType是一个指针或引用,但不是通用引用。
2. paramType是一个通用引用。
3. paramType既不是指针也不是引用。
1.paramType是一个指针或引用,但不是通用引用。
如果expr的类型是一个引用,忽略其引用部分来推导T再推导paramType。
2. paramType是一个通用引用
如果expr是左值,T和ParamType都会被推导为左值引用,唯一T和ParamType都推导成引用的方式。
如果expr是右值,沿用情景一的推导规则。
3. paramType既不为引用也不为指针的情况
成为一个完整的新对象(值传递),忽略引用部分。
const和volatile将会被忽略。
4. 数组实参
传导时退化为指针传导,除非被用于初始化引用。
5. 函数实参
传导时退化指针传导,除非被用于初始化引用。
总结:
有引用的实参引用会被忽略
对于通用引用(&&), 左值引用会被特殊对待(推导成引用)
const和volatile将常被忽略
数组或函数实参会退化为指针传递,除非被用于初始化引用(则被推导为引用)
2.理解自动(auto)类型推导
针对以下的三种情况讨论
1. 类型说明符是一个指针或引用但不是通用引用。
2. 类型说明符是一个通用引用。
3. 类型说明符既不是指针也不是引用。
总结:
auto类型推导和模板类型推导相同,只是{}初始化代表std::initializer_list,模板类型不支持。
auto 允许出现在函数返回值或者lambda函数形参中,沿用模板类型推导机制
3.了解decltype
总结:
decltype总是不加修改的产生变量或表达式的类型。
对于T类型的左值表达式, decltype总是产出T的引用类型T&
C++14支持decltype(auto),使用decltype规则推导
4.学会查看类型推导结果
总结:
typeid() 不总是可靠
可以使用 <boost/type_index,hpp>中type_id_with_cvr