当前位置: 首页 > news >正文

auto

auto关键字的使用

auto

auto关键字是在编译期推到出类型然后替换,auto关键字不允许定义数组,不允许作为普通函数的参数,C++14之前不允许作为函数的返回值但是支持返回值后置,auto修饰的变量必须直接初始化,类内非const static成员变量不能用auto来修饰。
C++11提供了auto来自动推导类型,很大程度上提高了代码的直观性:

std::unordered_map<std::string, std::vector<int>> data_map;
// 不用auto
std::unordered_map<std::string, std::vector<int>>::iterator iter = data_map.begin();
// 使用auto推导
auto iter = data_map.begin();

但是auto的推到仍然引入了一些奇怪的问题,在C++中,类型说明符(如int),不仅代表着「类型」的含义还有「定义变量」的含义,auto可以视为一种带有类型推导的类型说明符,其本质仍然是类型说明符,所以,它同样承担了定义动作的任务,例如:

auto a = 1; //OKauto arr = {1, 3, 4}; //ERR,auto不允许定义数组

在C++14之前,auto关键字不允许推导函数返回值,但是支持返回值后置语法,所以在这种场景下,auto仅仅作为占位符,既不表示类型,也不表示定义变量,仅仅只是为了保证结构完整:

auto fun(int a) -> int; // () -> int表示定义函数,int表示函数返回值类型// C++14之后
auto Func(int cmd) {if (cmd > 0) {return 5; // 用5推导返回值为int}return std::string("123"); // ERR,返回值已经推导为int了,不能多类型返回
}

auto推导原则

同样还是出自这句话“auto是用来代替类型说明符的”,因此auto在语义上也更加倾向于“用它代替类型说明符”这种行为,尤其是它和引用、指针类型结合时,这种特性更加明显:

int a = 5;
const int k = 9;
int &r = a;
auto b = a; // auto->int
auto c = 4; // auto->int
auto d = k; // auto->int
auto e = r; // auto->int

可以看到,不论是用普通变量、只读变量、引用、常量去初始化auto变量时,auto都只会推导其类型,而不会带走其只读性,左右性这些内容。所以,auto的类型推导,并不是推导某个表达式的类型,而是去推导当前位置最合适的类型,采用「最简推导原则」。
比如说上面auto c = 4这里,auto可以推导为int,int &&,const int,const int &,const int &&,而auto选择的是里面最简单的那一种。
auto还可以跟指针符、引用符结合,而这种时候它还是满足上面“最简单”的这种原则,并且此时指的是“auto本身最简单”,举例来说:

int a = 5;
auto p1 = &a; // auto->int *
auto *p2 = &a; // auto->int
auto &r1 = a; // auto->int
auto *p3 = &p2; // auto->int *
auto p4 = &p2; // auto-> int **

p1p2都是指针,但auto都是用最简原则来推导的,p2这里因为我们已经显式写了一个*了,所以auto只会推导出int,因此p2最终类型仍然是int *而不会变成int **。同样的道理在p3p4上也成立。

auto& auto&&

auto&

当你需要直接修改原对象,或者希望避免不必要的拷贝时,可以选择auto&auto&一般会推导为左值引用,当接受的类型为右值时会直接报错。同时,auto&不会忽略顶层const,因此如果初始值是一个常量,auto推导出的变量不是常量,你可以修改它。如果需要保留常量性,应使用 const auto

auto&&

万能引用,会发生引用折叠,auto &&并不是要“定义一个右值引用”,而是“定义一个保持左右性的引用”,也就是说,绑定一个左值时会推导出左值引用,绑定一个右值时会推导出右值引用。不会忽略 const,不会推导出非引用。

http://www.jsqmd.com/news/30395/

相关文章:

  • 一行“优雅”代码踩爆3x3矩阵:Python列表乘法的“共享引用”陷阱
  • 写给创业者新手:什么是MAU指标,什么是ARR、PMF
  • git不小心把本地从未提交过的贮藏的版本删掉了,如何恢复?
  • ffmpeg安装配置
  • 【C】 static用法
  • Python线程锁
  • 若依前端验证码的实现
  • 从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践
  • 实验4:MobileNet ShuffleNet - OUC
  • 模拟赛 31
  • CSP-S 2025 T3 小结
  • 第三十二篇
  • 2025年苏州AIGEO 优化服务商深度测评:TOP5 企业核心优势与实战案例对比
  • 使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
  • 第6章 语句
  • 十一月杂题
  • Modbus RTU 通信格式详解学习笔记
  • Selenium3+Python3 自动化项目项目实战day1
  • P1.python环境的配置和安装
  • Python 中可变对象的“引用赋值”特性——可变对象的“引用传递”
  • CSP-S 2025 游寄喵
  • Modbus协议分类及测试学习笔记
  • MarkDown初入
  • 英语_作文_8AU3_Curiosity
  • 习题-极大原理
  • 极大原理
  • P7. TensorBoard的使用(一)
  • 二分搜索优化DP(子序列问题)
  • 如何从手机内部恢复数据?2025年9大最佳手机数据恢复软件
  • 如何将数据从 Mac 硬盘恢复数据到电脑:所有方法