一,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;
}

 

 

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐