c++17 auto推导规则
规则1:
auto 声明的变量是按值初初始化。
如果没有显示的使用引用,也没有指针。那么编译器在推导的时候会忽略const和volatile限定符。
const int a =10;
auto b = a; // b 为 int, 而不是const
auto &c = a;// c 为 const int&
const auto e = a; //auto 推导的类型为int, e的类型为 const int(auto)
规则2:
auto声明变量初始化时。目标对象如果是引用,则忽略引用属性。
int a = 1;
int &b = a;
auto c = b; //c为int
规则3:
auto和万能引用声明变量时,对于左值会将auto推导为引用类型:
int a = 1;
auto&& b = i; //b为int& 引用折叠
auto&& c = 5; //C为int&& 右值引用
规则4:
使用auto变量,如果对象是一个数组或者函数,则auto会被推导成对应的指针类型:
int a[1];
auto b = a; //b为int *
int sum(int a, int b) {
return a+b;
}
auto c = sum; //c为 int (*)(int, int)
虽然a是数组类型,但是b会退化为指针类型,同样c也会退化为函数指针类型
规则5:
当auto关键字与列表初始化组合时。
- 直接使用列表初始化
- 用等号加列表初始化,列表中可以包含多个或者耽搁,auto类型被推到为std::initializer_list,请注意多个列表的时候类型必须相同.
auto a = {1,2}; // a为std::initializer_list<int>
auto b = {1}; // b为std::initializer_list<INT>
auto c{1}; // c为int
另外推荐大家一个在线调试.可以断点,调试,监视
支持c++98 到 c++20的网站.
https://www.onlinegdb.com/