C++ auto 关键字

本文详细介绍了C++11中引入的`auto`关键字,它用于自动类型推断,简化了代码,尤其是在迭代器使用和模板函数中。然而,也应注意其使用规范,如必须初始化,不能用于定义数组或函数模板参数等。此外,`auto`会忽略引用、const和volatile修饰,并在遇到数组时推导为指针或数组类型。

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

转自:C++ auto 关键字 - c&z - 博客园 (cnblogs.com)

 在C++ 98 中,auto 的作用是让变量成为自动变量(拥有自动的生命周期),但是该作用是多余的,变量默认拥有自动的生命周期,在C++ 11 中,已经删除了该用法,取而代之的作用是:自动推断变量的类型。

举例:

  int32_t a = 1;

  auto b = a;

  std::cout <<typeid(b).name() << std::end; // 输出结果:int  typeid运算符可以输出变量的类型

auto 在实际编程中的用法

  对于上面的情形,在实际编程中不推荐,因为不便于他人阅读,直接写出变量的类型会更加的清晰易懂。

1、auto 主要用于代替冗长复杂,变量使用范围专一的变量声明,比如:

  std::vector<std::string> vec;

  for (auto iter = vec.begin(); iter != vec.end(); ++iter) {}

2、auto 在定义函数模板时,用于声明依赖模板参数的变量类型

  模板函数依赖于模板参数的返回值,比如:

  template<typename Tx, typename Ty>

  auto multiply(Tx x, Ty y)

  {

    return x * y;

  }

注意事项:

(1)auto 变量必须在定义时进行初始化操作(这很好理解,如果不进行初始化操作,那么 auto 关键字就不能进行变量类型的推导了)//这个我理解是:auto 声明的变量,并不是执行到auto 这里的时候才去推导,而是在编译阶段就要完成推导。编译时,编译器需要根据初始化的类型来推导auto类型,所以写代码的时候auto声明的地方必须初始化,这个是为了编译时做推导用的。

(2)定义一个 auto 序列的变量时,必须是同一种类型,如:

  auto a = 1, b = 2, c = 3; // 正确

  auto a = 1, b = 2.2, c = 'c'; // 错误(这个道理和第一点注意事项相同)//这个我理解是:遇到auto时就做推导,即简单理解就是 类似于宏定义的展开。auto根据第一个变量的初始化就完成推导了,后面的变量声明,是auto已经确定类型之后的动作。所以,后面变量初始化的类型需要与第一个变量一致,不然声明就不对了。auto a = 1 就推导出auto是int型,那么声明语句其实展开后就是 int a = 1, b = 2.2, c = 'c';  这样写肯定就不对了。编译时就会报错。

(3)如果表达式是引用,则去除引用语义

  int32_t a = 1;

  int32_t& b = a;

  auto c = b; // 此时c的类型被推导为 int32_t,而不是int32_t&

  auto& c = b; // 此时c的类型才是int32_t&(自我理解,定义一个引用,那么就直接操作的是b,而b的类型是int32_t&,所以这里的类型是int32_t&)

(4)如果表达式是const或volatile(或两者都有),则去除const/volatile语义

(5)如果auto关键字带上&号,则不去除const语义

(6)如果表达式为数组,auto关键字推导类型为指针,如:

  int32_t a[3] = {};

  auto arr = a;

  std::cout << typeid(arr).name() << std::end; // 这里输出 int *

(7)如果表达式为数组,且auto带上&,则推导出的类型为数组类型,如:

  int32_t a[3] = {};

  auto& arr = a;

  std::cout <<typeid(arr).name() std::endl; // 这里输出int [3]

但是auto 关键字不能定义数组,比如下面的例子就是错误的:

char url[] = "http://c.biancheng.net/";
auto  str[] = url;  //str 为数组,所以不能使用 auto

(8)函数或模板参数不能被声明为auto

(9)auto不是一个真正的类型,仅仅是一个占位符,不能使用一些以类型为操作数的操作符,如sizeof或typeid

  std::cout << sizeof(auto) std::endl; // 错误

  std::cout << typeid(auto).name() std::endl; // 错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值