C++20标准下,auto类型占位符类型推导规则
·
一,auto类型占位符简介:
auto 是 C++ 中的类型占位符(非新类型),核心作用是让编译器自动推导变量 / 函数的类型,无需手动显式声明,简化代码且适配灵活场景。
- 本质:编译器根据「初始化器」(变量场景)或「实参类型」(函数形参场景)推导真实类型,功能类似template模板,个人感觉更便捷一些,可以替代手动写复杂 / 冗长的类型名;
- 支持标准:C++11 引入(变量声明)→ C++14 扩展(函数返回值)→ C++20 扩展(函数形参)。
二,常见应用场景:
1. 变量声明(C++11+)
需搭配初始化器(= 右边的值 / 表达式),编译器推导变量类型:
auto a = 10; // 推导为 int(初始化器是整型字面量)
auto b = 3.14; // 推导为 double(初始化器是浮点字面量)
auto c = &a; // 推导为 int*(初始化器是 int 变量的地址)
auto& d = a; // 推导为 int&(显式加 &,保留引用属性)
const auto e = 20; // 推导为 const int(保留 const 修饰)
2. 函数返回值(C++14+)
编译器根据 return 表达式的类型推导返回值类型,需保证所有 return 类型一致。
3. 函数形参(C++20+)
本质是「函数模板缩写」,每个 auto 对应独立模板参数,自适应实参类型:
// 等价于 template <typename T, typename U> auto f(T a, U b)
auto f(auto a, auto b) { return a / b; }
f(2, 3); // 推导 a=int、b=int,返回 int
f(2, 3.0); // 推导 a=int、b=double,返回 double
注意:当出现两函数值类型不同时(如以上代码最后一行)遵循数值类型提升规则。
// 操作数1:2(int类型),操作数2:3.0(double类型)
// 通常算术转换:int → double(因为double优先级高于int)
auto result = 2 / 3.0; // 实际是 2.0(double) / 3.0(double)→ 结果类型double
简介数值类型提升规则:
包括:整型提升:窄整数类型转宽整数类型,浮点提升:float 转 double及混合运算时按优先级提升(最常用)
混合运算时的优先级:1,long double 2,double 3,float 4,整数类型
另外,若操作数包含「有符号整数」和「无符号整数」,会将有符号整数转换为无符号整数
int a = -1;
unsigned int b = 1;
// a→unsigned int(值为4294967295,取决于平台)
if (a > b) {
// 条件会成立,因为-1转成unsigned int后是很大的正数
cout << "a > b" << endl;
}
更多推荐
所有评论(0)