auto关键字的使用

c++11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。例如:

int a = 10;
auto auto_a = a;//自动进行类型推断,因为a为int型,所以au_a也为int型
cout << typeid(au_a).name() << endl;//输出可得知 au_a的类型为int型

注意

auto的自动类型推导发生在编译器,所以使用auto并不会导致程序运行时效率的降低。
auto和其他变量类型的区别:

  1. auto声明的变量必须要初始化,否则编译阶段编译器不能判断变量的类型
  2. auto 不能被声明为返回值,也不能作为形参,也不能被修饰为模板参数

auto的常见正确用法

  1. 代替冗长复杂、变量适用范围专一的变量声明
    替代容器迭代器,例如
    std::vectorstd::string vs;
    for(auto i = vs.begin(); i != vs.end(); i++)
    {
    //……
    }
    在循环中,auto帮我们自动推导i的数据类型,而不用再去定义长长的迭代器定义。

decltype

decltype关键字和auto相互对应的,他们经常在一些场所配合使用。decltype可以在编译的时候判断出一个变量或者表达式的类型。例如

auto num = 1;	//num 是 int 型
decltype(num) num2 = num; //num2 也是 int 型的

注意事项

  • auto 声明的变量必须在定义时初始化,类似于const 关键字
  • 用auto定义一个序列的变量时必须始终推导成同一类型。例如:
auto a4 = 10,a5 = 20;//正确
auto b4 = 10,b5 = 'a';//错误,推导类型不一样
  • 使用auto关键字做类型自动推导时,依次施加以下规则
  1. 初始表达式是引用的时候,去除引用语义。例如:
int a = 10;
int &b = a;

auto c = b;//此时C的引用语义被去除了,类型为int
auto &d = b;//此时C的类型才为 int &

c = 100;	//a = 10;
d = 100;	//a = 100;
  1. 初始表达式为const,则去除const语义。例如:
const int a1 = 10;
auto b1 = a1;//此时b1的const语义被去掉了,类型为int
const auto c1 = a1;//此时的C1类型才为const int
b1 = 100;//合法
c1 = 100;//非法
  1. 如果auto关键字带上&号,则不去除const语意
const int a2 = 10;
auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
b2 = 10;//非法

之所以不去除const,是因为b2是a2的引用,a2为const的,如果b2是a2的非const引用,则通过b2可以修改a2的值,这明显不合理

  1. 初始化表达式为数组时,auto关键字推导类型为指针。例如:
int a3[3] = {1, 2, 3};
auto b3 = a3;
cout << typeid(b3).name() << endl;//输出 int *
  1. 若初始化表达式为数组切auto 带上 &号,则推导类型为数组类型。例如:
int a3[3] = {1, 2, 3};
auto &b3 = a3;
cout << typeid(b3).name() << endl;//输出 int [3]
  1. 函数或模板参数不能被声明为auto
void func(auto a) //错误
{
	//……
}
  1. 时刻记得auto并不是一个真正的类型,它只是一个关键字,一个占位符,在编译阶段会被推导为真正的类型,不能用一些以类型为操作数的操作符,例如:
cout << sizeof(auto) <<endl;//错误
cout << typeif(auto).name() <<endl;//错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值