关键字:
auto
需要注意的时auto的自动推导并不是100%可靠的。这与它的推导规则有关。
已知变量:
expr
求:
paramType t = expr 中的t是什么类型
推导规则1: ParamType == auto
1. 如果expr是引用类型则忽略引用(比如int& -> int)
2. 在1.的基础上,如果expr还有顶层const修饰符则忽略它(比如int* const -> int*)
3. expr剩下的类型就是 t 的类型
示例:
int x = 1;
const int cx = x;
int& rx = x;
const int& crx = x;
int* px = &x;
const int* const cpxc = &x;
auto a1 = x;
auto a2 = cx;
auto a3 = rx;
auto a4 = crx;
auto a5 = px;
auto a6 = cpxc;
推导规则2:ParamType == auto*
1. 先当作ParamType == auto进行推导
2. 在1.的基础上得到的类型与 * 做并集(比如int* 与 * 并集得到int*)
示例:
int x = 1;
const int cx = x;
int& rx = x;
const int& crx = x;
int* px = &x;
const int* const cpxc = &x;
auto* a1 = &x;
auto* a2 = &cx;
auto* a3 = ℞
auto* a4 = &crx;
auto* a5 = px;
auto* a6 = cpxc;
推导规则3:ParamType == auto&
1. 如果expr是引用类型则忽略引用
2. 在1.的基础上得到的类型与 & 做并集(比如int 与 & 并集得到int&)
示例:
int x = 1;
const int cx = x;
int& rx = x;
const int& crx = x;
int* px = &x;
const int* const cpxc = &x;
auto& a1 = x;
auto& a2 = cx;
auto& a3 = rx;
auto& a4 = crx;
auto& a5 = px;
auto& a6 = cpxc;
推导规则3:ParamType == auto&&
1. 如果expr是一个左值,使用推导规则3
2. 如果expr是一个右值,在推导规则1的基础上与&&做并集
示例:
int x = 1;
const int cx = x;
int& rx = x;
const int& crx = x;
int* px = &x;
const int* const cpxc = &x;
auto&& a1 = x;
auto&& a2 = cx;
auto&& a3 = rx;
auto&& a4 = crx;
auto&& a5 = px;
auto&& a6 = cpxc;
auto&& a7 = 27;
补充:
在面对数组类型时,数组类型将会退化为指针(int[3]退化为int*)
在面对函数时,函数也会退化为指针(void(int)退化为void*(int))
那么auto在进行推导时,会以退化类型为准
以上的推导规则同样适用于模板
template<typename T>
void f(ParamType t);
f(expr);
auto独有的:
int x = {27};
int x1{22};
auto t = x;
auto t1 = x1;
原因是因为{}其实是一个模板