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

C++11中auto类型说明符

随着程序越来越复杂,有时侯根本搞不清到底需要的类型是什么,程序员不得不回过头去从程序的上下文中寻求帮助。但 auto类型说明符能让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初始值。

使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样:

auto i = 0, *p = &i; //i是整数,p是整型指针

特别的,当引用被用作初始值时,真正参与初始化的其实是引用对象的值,因为使用引用其实是使用引用的对象。此时编译器以引用对象的类型作为auto的类型:

int i =0, &r = i; auto a = r; //a是一个整数(r是i的别名,而i是一个整数)

其次,auto一般会忽略掉顶层const,同时底层const则会保留下来:

const int ci=i, &cr=ci; auto b=ci; //int变量(ci的顶层const被忽略) auto c=cr; //int变量 auto d=&i; //指向int变量的指针 auto e=&ci; //指向int常量的指针(对常量对象取地址是一种底层const) auto &g=ci; //int型常量引用

先简单介绍一下常量引用:

auto &g=ci; auto &h=42; //非法,不能为非常量引用绑定字面值 const auto &j=42 //合法,可以为常量引用绑定字面值

常量引用的const是底层const,其引用的对象值为常量。

为什么写 auto &g = ci; 推导之后const却留下来了?

答:顶层const只有拷贝初始化的时候才会被auto丢弃:

auto k = ci; // 拷贝语义:复制ci的值生成独立新变量k,顶层const作用对象只是旧变量ci, //所以k不需要继承这个const,k的类型为int

而 auto &g = ci; 是引用绑定,并非拷贝:

引用不会复制出新数据,g直接绑定ci对应的那块内存。此时限制“这块内存的值不能改动”的const,身份发生了视角切换:

  • 站在 ci 本身的角度:const约束ci自己,属于顶层const;
  • 站在引用g的视角:g访问的是下层被绑定的数据,这个const就转变为底层const,用来约束引用指向的内容不可修改。

auto推导引用的时候会保留底层const,因此最终 g 得到 const int& 。

如果希望推断出的auto类型是一个顶层const,需要明确指出:

const auto f = ci; //int常量

切记,符号&和*只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同一个类型:

auto k=ci,&l=i; //k是整数,l是整数引用 auto &m=ci,*p=&ci; //m是对整型常量的引用,p是指向整型常量的指针 auto &n=i,*p2=&ci; //非法 i的类型是int,而&ci的类型是const int
http://www.jsqmd.com/news/1191388/

相关文章:

  • XXL-Job分布式调度平台高可用集群部署与配置实战
  • 从几何变换到数据降维:特征值与特征向量的核心应用解析
  • 【2027最新】基于SpringBoot+Vue的协同过滤算法东北特产销售系统管理系统源码+MyBatis+MySQL
  • OpenHarmony轻量系统开发【1】从零认知:系统类型、内核与开发板选型指南
  • 量化交易三剑客:MA、MACD、RSI技术指标实战指南
  • Python零基础入门:环境配置、基础语法与调试技巧全解析
  • 2026年五大财务报表分析软件:功能与安全解析 - 科技焦点
  • MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第四章:博客 / 论坛数据库设计
  • 【C++】从线性到对数:vector查找算法全解析与实战指南
  • STM32H7-MPU配置实战:Cache策略与DMA性能优化
  • Ultra Librarian云端库与本地离线工具全流程应用指南
  • 老旧建筑地基空洞预警与应急响应:从风险识别到安全撤离实操指南
  • 围棋AI训练工具:点三三开局应对策略的实战部署指南
  • 医疗AI专业性三重验证:数据、临床、指南如何构筑可信底座
  • 古文字识别技术实践:从图像处理到深度学习应用指南
  • Grok:X平台内置的跨模态生产力操作系统
  • 1 jvm基础
  • 从零到一:基于51单片机的智能交通灯系统设计与实现
  • Unity本地化GetLocalizedString失效全解析:从诊断到修复
  • MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第六章:TypeORM Entity 设计
  • ARM64嵌入式Linux系统FIT uImage启动流程详解与实战
  • 电力系统稳定性的三大支柱:功角、电压与频率稳定的内在关联与工程实践
  • 阿里云轻量服务器+飞书+Qwen3.6-Plus零基础AI助手部署指南
  • 数字逻辑实验进阶——基于Multisim的组合逻辑电路设计与仿真
  • Unity游戏框架GameFramework快速入门:10分钟搭建可运行项目
  • Java控制台交互实战:从Scanner精准捕获到printf优雅格式化
  • 【Multisim仿真实战】从零构建四路抢答器:核心电路模块深度解析与调试技巧
  • 沁恒 CH32V208(二): 深入解析存储映射、零等待机制与多外设时钟配置
  • TK1初始使用全指南:设备校准、行为基线与服务激活三步闭环
  • GaussianSplatting训练教程