不想写表达式的类型?试试auto吧

开发 后端
你以为我说的自动变量类型auto吗?非也,我们知道C语言中其实也有auto关键字,它和早期C++中的auto关键字一样,它修饰局部变量,表示自动存储期。

你以为我说的自动变量类型auto吗?非也,我们知道C语言中其实也有auto关键字,它和早期C++中的auto关键字一样,它修饰局部变量,表示自动存储期,不过由于默认就是这种,因此我们其实常常见不到这样的写法:

  1. auto int a =10

本文要介绍的并不是上面的auto,而是C++11中引入的auto关键字。

[[283427]]

效果

看看下面的代码:

  1. #include<iostream>
  2. #include<vector> 
  3. int main() 
  4.     std::vector<int> vec{1,2,3,4,5}; 
  5.     for(std::vector<int>::const_iterator it = vec.begin();it != vec.end();++it) 
  6.     { 
  7.         std::cout<<*it<<std::endl
  8.     } 
  9.     return 0; 

对于it的类型,你自己能快速写出来吗?我反正是写不出来。

再看auto版本:

  1. #include<iostream> 
  2. #include<vector> 
  3. int main() 
  4.     std::vector<int> vec{1,2,3,4,5}; 
  5.     for(auto it = vec.begin();it != vec.end();++it) 
  6.     { 
  7.         std::cout<<*it<<std::endl
  8.     } 
  9.     return 0; 

是不是简洁了许多?

没错,今天就是介绍自动类型推导关键字auto。

auto的作用

说实在的,程序员有时候就是“懒”,可能连个表达式的类型都不想写,auto就是这样一个关键字,它让编译器替我们去分析表达式的类型。

当然了,分析的前提是auto定义的变量有初值,如果连值都没有,怎么可能知道它是什么类型?

auto用法

(1) 普通类型推导

例如:

  1. auto i = 10;//i为int类型 
  2. auto d = 10.2//d 为double类型 
  3. auto f = 10.2f//f为float类型 

(2) const关键字修饰的类型推导

通常auto会忽略掉顶层const(本身是常量,如int *cosnt p),而会保留底层const(指向的对象是常量,如const int* p)。

举个例子顶层const的例子:

  1. const int ci = 10
  2. auto aci = ci;//忽略顶层const,推导ci是int,所以aci类型是int 
  3. const auto ca = ci//推导ci是int,但是前面有const,所以ca是const int 

再说一个底层const的例子:

  1. const int arr[] = {11}; 
  2. auto p = arr;//arr 是const int *,这是底层const,推导后,保留底层const,所以p是 const int* 

arr数组名被当成指针是,是const int*类型,或者说是int const*,它指向的对象是只读的,因此是底层const,保留,最终p的类型也是int const *。

当然auto还可以设置引用类型,例如:

  1. const int ci = 10
  2. auto &cp = ci;//cp是一个整型常量引 

如果是字面值,则必须加上const:

  1. const auto &ref = 10;//10是字面值,常量引用才能绑定字面值 

想一想

想想下面推导的size类型是什么?

  1. std::vector<int> vec; 
  2. auto size = vec.size(); 

没错,它是std::vector::size_type。

要你写下来你肯定不愿意。

不过下面这样是没法推导的奥:

  1. vector<string> aa; 
  2.    //vector<string> bb = aa;//无法推导出模板类型 

下面这段程序帮你查看真正类型的名称,仅供参考:

  1. #include <iostream>
  2. #include <vector> 
  3. #include <cxxabi.h> 
  4. #include <typeinfo> 
  5. int main() 
  6.     int     status; 
  7.     char   *realname; 
  8.     auto type = 1.1; 
  9.     realname = abi::__cxa_demangle(typeid(type).name(), 0, 0, &status); 
  10.     std::cout << typeid(type).name() << " => " << realname <<std::endl
  11.     free(realname); 
  12.     return 0; 

输出结果:

  1. double 

总结

乍一看,好像挺简单的那么一回事,不过使用auto最好注意类型推导规则,不是很明确的规则不建议以代码可读性为代价而简化代码。

当然了,它也有以下特点:

  • 可能使得代码可读性差
  • 某些情况auto得到的类型可能不是你想要的

因此一定要合理使用。

 

责任编辑:赵宁宁 来源: 编程珠玑
相关推荐

2022-03-28 06:19:14

正则表达式开发

2021-11-10 09:45:06

Lambda表达式语言

2014-01-05 17:41:09

PostgreSQL表达式

2024-03-25 13:46:12

C#Lambda编程

2018-09-27 15:25:08

正则表达式前端

2012-06-26 10:03:58

JavaJava 8lambda

2017-09-06 15:15:48

Python正则表达式

2009-09-11 12:32:33

LINQ表达式

2009-09-10 15:35:07

LINQ查询表达式

2011-10-28 16:34:13

LINQ

2022-12-05 09:31:51

接口lambda表达式

2009-07-03 18:31:04

JSP表达式

2009-09-15 15:18:00

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-17 14:21:19

LINQ表达式

2009-09-11 09:48:27

Linq Lambda

2009-09-09 17:45:07

Linq表达式

2020-09-04 09:16:04

Python正则表达式虚拟机

2021-01-07 10:15:55

开发 Java开源

2020-10-14 10:18:05

Python三元表达式代码
点赞
收藏

51CTO技术栈公众号