网站开发asp.net和sql数据库,国家域名注册服务网,重庆市建设工程信息网登录入口,wordpress 菜单状态系列文章目录
C11新特性使用详解-持续更新 文章目录 系列文章目录前言一、auto关键字1.根据变量的初始化表达式来推导变量的类型2.const与引用 二、decltype关键字1.推断表达式的类型2.const与引用 三、总结 前言
auto和decltype是C11引入的俩个重要的新关键字#xff0c;用…系列文章目录
C11新特性使用详解-持续更新 文章目录 系列文章目录前言一、auto关键字1.根据变量的初始化表达式来推导变量的类型2.const与引用 二、decltype关键字1.推断表达式的类型2.const与引用 三、总结 前言
auto和decltype是C11引入的俩个重要的新关键字用于在编译期自动推导出变量或表达式的类型。极大提高代码的可读性和简洁性并且有助于减少类型转换错误。 一、auto关键字
编程时常常需要把表达式的值赋给变量这就要求变量申明时必须清楚知道表达式的类型。做到这点不容易或者根本做不到。为了解决这个问题C11引入auto关键字让编译器自动推导变量的类型。
1.根据变量的初始化表达式来推导变量的类型
auto a 1; // a的类型为int
auto b 5.20; // b的类型为double
auto c auto; // c的类型为const char[6]
auto person1 Person(); // person1的类型为Person,并且自动初始化成员变量变量
auto person2 Person{ Fei, 30 }; // person2的类型为Person,并且根据指定的初始值初始化成员变量变量std::vectorint vec { 1, 2, 3, 4, 5 };
for (auto it vec.begin(); it ! vec.end(); it) { // 在for循环中使用auto推导类型std::cout *it ;
}2.const与引用
使用引用其实是使用引用的对象。特别是当引用被当作初始值时正在参与初始化的是引用对象的值。此时编译器以引用对象的类型作为auto的类型。
int i 10, r i;
auto aa r; //推导出aa类型是intr是i的别名i是int正在参与初始化的是引用对象的值以引用对象的值作为auto的类型//auto一般会忽略顶层const,同时底层const则会被保留
const int ci i, cr ci;
auto bb ci; //推导出bb类型是intci的顶层const特性被忽略了
auto cc cr; //推导出cc类型是intcr是ci的别名ci本身是一个顶层const
auto dd i; //推导出cc类型是int*
auto ee ci; //推导出cc类型是const int*对常量对象取地址是一种底层const//如果希望auto推断出来的类型是一个顶层的const需要明确指出
const auto ff ci; //推导出b类型是int//设置类型为auto的引用是初始值中的顶层常量属性任然保留
auto gg ci; //推导出b类型是const int二、decltype关键字
希望从表达式的类型中推导除要定义的变量的类型但是不想用该表达式的值初始化变量。为了满足这各要求C11引入decltype关键字让编译器自动推导表达式的类型而不用计算表达式的值。
1.推断表达式的类型
int x 10;
decltype(x) y; //y的类型是intdouble foo();
decltype(foo()) z; //z的类型是double根据函数返回值类型推导2.const与引用
decltype处理顶层const和引用的方法和auto不同。 如果表达式是一个引用类型decltype会去除引用推导出引用所引用的类型。 例如对于表达式int x, decltype(x)的推导结果是int去除了引用。
需要注意的是decltype推导出的类型会保留顶层const限定符和volatile限定符不会去除它们。
const int cii 10, cjj cii;
decltype(cjj) xx 0; //x的类型是const int
decltype(cjj) yy xx; //x的类型是const inty绑定到x
//decltype(cjj) zz; //错误: z是个引用必须初始化int xxx 0;
decltype(xxx) pp 0;三、总结
在不影响代码可读性的前提下可以尽可能的使用auto。复杂类型用auto但是简单内置类型就没有必要使用auto了。总之避免过度使用auto和decltype以保持代码的可读性和维护性。