auto类型指示符(C++11)

本文介绍了C++中auto关键字在C++98和C++11标准中的不同用法。C++98中auto用于声明自动变量,多余且极少使用,C++11已删除该用法。C++11的auto是变量的自动类型推断,让编译器通过初始值推算变量类型,同时还介绍了auto处理引用和const的问题及相关注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++98 auto

早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期:

int a =10 ; //拥有自动生命期 
auto int b = 20 ;//拥有自动生命期 
static int c = 30 ;//延长了生命期

C++98中的auto多余且极少使用,C++11已经删除了这一用法,取而代之的是全新的auto:变量的自动类型推断

C++11 auto (C++11新特性)

编程的时候常常需要把表达式的值赋给变量,这就要求在声明的时候清楚的知道表达式的类型。然而这并不容易,有的时候甚至根本做不到。为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如double)不同,auto让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初值(以此来判断当前的类型)。

auto item = val1 + val2;
//item初始化为val1和val2相加的结果

此处的编译器将根据val1和val2相加的结果来判断item的类型。如果val1和val2是自定义类型(class)的对象,则item的类型就是自定义类型(class)。如果val1和val2的类型是double的话,则item的类型就是double。


如是简单的了解的话到这里就OK

注:
  1. auto 变量必须在定义时初始化,这类似于const关键字。
  2. 定义在一个auto序列的变量必须始终推导成同一类型
C++
auto a4 = 10, a5 = 20, a6 = 30;    //正确 

auto b4 = 10, b5 = 20.0, b6 = 'a';    //错误,没有推导为同一类型

auto 处理&(引用时的问题)

编译器推断出来auto的类型和初值的类型并不完全一样。
例如:

int a = 10;
int &b = a; //b为a的引用
auto tmp = b;
 cout << typeid(tmp).name() << endl;
 //输出int
auto处理const的问题

auto一般会忽略掉顶层const,同时底层的const会保留下来,比如当初值是一个指向常量的指针时:

const int ci = i , &cr = ci;
auto b = ci; //不是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr;  //c是一个整数(cr是ci的别名,ci本身是一个const)
auto d = &i;  //d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci;  //e是一个指向整数常量的指针(对常量取地址是一种底层的const)
小结:
  • 如果auto关键字带上&号,则不去除const语意。
  • 初始化表达式为数组时,auto关键字推导类型为指针。
  • 若表达式为数组且auto带上&,则推导类型为数组类型
  • 函数或者模板参数不能被声明为auto
  • 时刻要注意auto并不是一个真正的类型。
    auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值