// C++11,不允许进行C++接口参数的类型推导,在C++20中可以
// C++11,不允许进行C++接口返回值的自动推导, C++14可以
// 目前:我的Linux系统默认编译器为C++14
1、自动推导--auto 与 decltype
2、auto
// auto : 自动类型推导,编译器进行推导
/**
* 注意事项:
*
*
* 1、定义时,必须进行初始化
* 2、一个auto,推导一个类型
* 3、auto,不能推导数组,可以推导数组指针
* 4、auto, 不能用于推导模板,模板不能进行推导
* 5、auto, 会忽略引用属性和const,()
*
* 适用场景:
* 不关心数据类型时,是复杂类型
* C++14 允许进行返回值自动推导
* C++20 允许进行参数的自动推导
*
* 缺点:
* 乱用,导致代码质量下降; 变量声明时,命名需要具有说明性
*
*/
实例1:
auto 定义时,必须进行初始化
auto a = 10;
auto b= 2.9;
实例2:
C++11,不允许进行C++接口参数的类型推导,在C++20中可以
void func_auto(auto a)
{
std::cout<<a<<std::endl;
}
实例3:
auto,不能推导数组,可以推导数组指针
//auto c[]={0,1,2}; //报错:“auto”类型不能出现在顶级数组类型中
int c[]={1,2,5,9};
auto d = c; //可以推导数组指针
实例4
不能进行模板推导
// std::vector<auto> v = {1,2,3};
实例5
简化遍历容器内的数据
如:std::vector<int> v;
for(auto ite: v)
{
std::cout<<*ite<<" "
}
std::cout<<std::endl;
统一修改容器内所有数据
for(auto& ite:v)
{
ite *= 2;
}
3、decltype
// decltype: 推导表达式类型
/**
* 注意事项
* 1、 不要进行初始化
* 2、 在编译器进行表达式分析,不会真的去计算表达式; (不会造成额外的性能损耗)
* 3、 保留引用属性和const属性
*
* 使用场景:
* 1、 实现重定义:将类型进行重定义,简化代码,提高可读性
*
*/
实例1:
在编译器进行表达式分析,不会真的去计算表达式
//不需要进行初始化
decltype(func_decltype()) a; //int func_decltype() : 只是分析得出类型,并不进行计算
a = func_decltype(); //必须对函数进行调用
实例2:
保留引用属性和const属性
const int& func_decltype()
{
static int b = 10;
std::cout<<"func"<<std::endl;
return b;
}
decltype(func_decltype()) a=9; //a的属性,const int &a
4、 返回值推导后置
// 返回值推导后置
template<typename D,typename T>
auto add(D a,T b)->decltype(a+b)
//通过decltype()来类型推导接口的返回值,如果放在接口名的前面,编译器无法识别 参数a,b的类型
// 所以 先使用auto推导, 再对 decltype(a+b) 进行后置,
{
return a+b;
}