c++11auto的用法(特别是注意事项)

文章介绍了C++中的auto关键字如何在声明变量时自动推断类型,以及其在编译期的工作原理。同时列举了auto的使用限制,包括初始化要求、类型一致性、引用处理和对函数模板的适用性等。
摘要由CSDN通过智能技术生成

c++11 auto

auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型:

 
  1. auto i =100; // i 是 int

  2. auto p = new A(); // p 是 A*

  3. auto k = 34343LL; // k 是 long long

这种用法就类似于C#中的var关键字。auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。是否会造成编译期的时间消耗,我认为是不会的,在未使用auto时,编译器也需要得知右操作数的类型,再与左操作数的类型进行比较,检查是否可以发生相应的转化,是否需要进行隐式类型转换。

对于上面的示例,在实际编程中并不推荐,因为不便于他人阅读,直接写出变量的类型会更加的清晰易懂,主要用于代替冗长复杂,变量使用范围专一的变量声明,比如:

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

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

在定义函数模板时,用于声明依赖模板参数的变量类型,模板函数依赖于模板参数的返回值:

 
  1. template<typename Tx, typename Ty>

  2. auto multiply(Tx x, Ty y) // c++14

  3. {

  4. return x * y;

  5. }

auto使用注意事项

(1)auto 变量必须在定义时初始化,这类似于const关键字;

(2)定义在一个auto序列的变量必须始终推导成同一类型,如:

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

  2. auto a = 1, b = 2.2, c = 'c'; // 错误(这个道理和第一点注意事项相同)

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

 
  1. int a = 1;

  2. int &b = a;

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

  4. auto &c = b; // 此时c的类型才是int&

(4)如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义。

 
  1. const int a = 10;

  2. auto b= a; // b的类型为int而非const int(去除const)

  3. const auto c = a; // 此时c的类型为const int

  4. b = 100; // 合法

  5. c = 100; // 非法

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

 
  1. const int a = 10;

  2. auto &b = a; // 因为auto带上&,故不去除const,b类型为const int

  3. b = 10; /非法

(6)初始化表达式为数组时,auto关键字推导类型为指针。

 
  1. int a[3] = { 1, 2, 3 };

  2. auto b = a;

  3. std::cout << typeid(b).name() << std::endl; // 这里输出 int*

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

 
  1. int a[3] = { 1, 2, 3 };

  2. auto &b = a;

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

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

 
  1. void func(auto a) // 错误

  2. {

  3. //...

  4. }

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

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

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

引用大佬链接:c++ auto用法_c++ 关键字auto-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值