C++ 类型推导与命名空间
一、auto 关键字详解1. 概念定义auto 是 C11 新增关键字可让编译器根据变量初始化值自动推导变量实际类型。auto a 10; // int auto dx 12.25; // double auto fx 23.34f; // float auto p a; // int*硬性规则auto 定义变量必须初始化无初始值无法完成类型推导。auto x; // 编译报错2. 基础使用规范1.依托右侧表达式完成类型推导2.同一行定义多个 auto 变量所有变量类型必须完全一致auto x 10, y 20; // 正确 auto x 10, y 3.14; // 错误3.auto 与指针搭配int a 10; auto* p a; // 显式推导为int* auto q a; // 隐式推导为int*3. auto 类型推导特殊规则1.默认剔除引用与 const 属性int a 10; int ra a; const int cra a; auto x ra; // 仅推导为int丢失引用 auto y cra; // 仅推导为int丢失const与引用2.auto 保留引用属性auto x ra; // 推导为int可修改原变量3.auto* 保留指针底层 const 属性4. auto 与数组普通 auto 推导数组名数组会退化成为指针丢失数组长度auto 推导可保留完整数组类型与长度int ar[5] {1,2,3,4,5}; auto x ar; // int* auto y ar; // int()[5]auto 无法直接定义数组初始化列表会被推导为初始化列表类型5. auto 作为函数参数C11 不支持C14 及以上标准可直接使用等价隐式模板自动匹配实参类型。6. auto 核心使用限制不能用于数组声明定义大括号初始化列表内元素类型必须统一不能作为结构体成员变量类型C11 无法用于函数返回值推导二、decltype 类型获取关键字1. 核心作用C11 引入无需初始化、不执行表达式直接精准获取表达式真实类型。int a 10; decltype(a) b 20; // b为int类型2. 常用场景定义与已有变量同类型变量编译期获取函数返回值类型不调用函数精准保留 const、引用全部属性3. 特殊语法decltype(变量名)获取值类型decltype((变量名))强制推导为引用类型。4. auto 与 decltype 核心区别auto依赖初始化值自动剔除 const、引用必须初始化decltype依托表达式完整保留所有类型属性无需初始化三、using 关键字三大用法1. 引入命名空间using 声明单独引入命名空间内单个成员using 指令一次性引入整个命名空间开发规范头文件禁止全局 using namespace避免命名污染2. 类型别名替代老旧 typedef语法更直观适配指针、数组、函数指针。// typedef写法 typedef void (*PFun)(int); // using写法 using PFun void(*)(int);3. 模板别名using 独有优势typedef 不支持模板别名using 可快速简化 STL 嵌套容器、自定义模板类型。templateclass T using Vec vectorT; Vecint v; // 等价vectorint四、命名空间 namespace设计目的解决全局命名冲突隔离不同模块代码访问方式命名空间::成员名支持嵌套定义层级调用访问全局无前缀::代表访问全局作用域成员五、学习总结auto 侧重快速自动匹配类型简化代码书写适合日常快速开发decltype 侧重精准获取原始类型适合模板编程、类型推导复杂场景using 兼顾命名空间管理与类型简化模板别名是核心实用亮点