1.auto 关键字

  1. auto 不能保留const 属性

  2. auto 会优先推断为值类型而非引用类型

  3. 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&。
*/