1.auto 关键字
auto 不能保留const 属性
auto 会优先推断为值类型而非引用类型
auto 利用函数返回值来确定类型的时候,函数会执行
示例:
//auto 不能保留const 属性
const int a{};
auto c = a; //const属性丢失
//auto 会优先推断为值类型而非引用类型
int b{2500};
int& lb{b};
auto c = lb; //c还是int类型 引用丢失
//auto 利用函数返回值来确定类型的时候,函数会执行
auto x = ave(1,2);//ave(1,2)会执行x的类型依据ave函数的返回类型来确定
//auto 关键字和拖尾函数
auto bigger(int& a,int& b)->int&{return a > b ? a : b};
//由于 auto 会自动转化为非引用类型 为了达到某种使用 引用的场景使用需求 可以使用 拖尾函数
2.decltype
语法 decltype(表达式)
int a{};
unsigned b{};
decltype(a-b) x;//相当于 unsigned x;
如果 decltype内的 表达式,没经理过任何运算,那么得出的数据类型同表达式内的数据类型,并且decltype可以保留const和引用类型;
如果 decltype内的表达式经理了运算,那么得出的数据类型是根据运算结果是否由固定的内存地址(左值)来决定的,如果有固定内存地址则得出的类型为该类型的引用类型,如果没有固定的内存地址,则得出的类型为该结果的类型
//例如:
int a{100};
int b{150};
int* pa{a};
int& la{a};
decltype(a+b) x; //相当于 int x;
decltype(*pa) x; //相当于 int& x;
decltype(pa) x; //相当于 int* x; 未经运算
decltype(pa[0]) x; //相当于 int& x;
decltype(fun(a,b)) x;//不会执行函数 和 auto不同 auto x = fun(a,b);
//常用:c++11
auto bigger(int& a,int& b)->decltype(a > b ? a : b)
{
return a > b ? a : b;
}
//c++14 新写法
decltype(auto)bigger(int& a,int& b)
{
return a > b ? a : b;
}
问题:
int a{};
decltype(a++) x;
decltype(++a) x;
//x分别都是什么类型?
//猜想:由于a++ 是事后计算还未经运算算a 推断x 为int 第二个计算则为 int&
/**
decltype(a++) x;
a++ 是一个后置递增操作符。
后置递增操作符返回的是变量a的原值副本(即未递增前的值),但其类型是a的类型。
因此,decltype(a++)的类型是a的类型,但不是引用类型。
如果a是一个整数类型,比如int,则decltype(a++)的类型是int。
decltype(++a) x;
++a 是一个前置递增操作符。
前置递增操作符返回的是变量a递增后的值,并且返回的是左值引用。
因此,decltype(++a)的类型是a的类型,但会是一个左值引用。
如果a是一个整数类型,比如int,则decltype(++a)的类型是int&。
*/