总述
C++中有一个关键字,它不进行显式声明,而进行隐式推导,auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。C++语言类似的关键字还有decltype。
如何评价 C++ 11 auto 关键字? 既然auto关键字可以用来做类型推断,使得C++在使用auto时更像是在用动态类型语言。 既然auto能帮我们偷很多懒,那平时写C++还有必要像之前一样显式声明类型吗?最佳实践是如何,应当彻底改变之前的C++习惯尽可能大量地使用auto,还是在什么样的特定的情形下才使用auto? 知乎问答
知乎上有这么一条问题很有意思,大家对于auto使用有很多的讨论,接下来我就一点点解开auto的神秘面纱,让大家来进行评判auto。
作者:良知犹存
转载授权以及围观:欢迎添加微信公众号:Conscience_Remains
先上一段小代码:
auto f = 3.14;  //double
auto s("hello"); //const char*
auto z = new auto(9); //int *
从上面可以看到,我们声明不需要定义显性的类型,只需要用auto定义进行自动推导即可。
 
编程时经常需要把表达式的值赋给变量,这就要求声明变量的时候,我们可以清楚的知道表达式的类型。然而很多时候名字空间、模板成为类型的一部分,导致了程序员在复杂类型的初始化声明中如履薄冰,所以C++11中引入了auto类型说明符,用它就可以让编译器替我们分析表达式所属的类型。

简洁之道:

举一个经常使用的容器的iterator的例子:
#include <string>
#include <vector>
void test(std::vector<std::string>&vs)
{
std::vector<std::string>::iterator i=vs.begin();
for(;i<vs.end();i++) { }
}
用std::vector<std::string>::iterator定义变量i,在c++中是一个安全可靠的方法,但是名字也是很长,如果用auto的话,代码会简洁很多。如下:​​​​​​​
#include <string>
#include <vector>
void test(std::vector<std::string>&vs)
{
for( auto i=vs.begin();;i<vs.end();i++){
}
}

误区之所:

虽然auto可以自动推导类型,但是定义的规则我们还需要注意。
auto i=0,*p=& i; //正确
auto y; //错误,auto定义的变量必须有初始值
auto sz=0,pi=3.14;//错误,sz和pi的类型不一样
c++11引入了auto类型说明符,auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。 详细解释一下:
 
这里的y,我们使用auto关键字来声明,但是不立即对其进行定义,此时编译器则会报错。这跟通过其他关键字(除去引用类型的关键字)先声明后定义的变量的使用规则是不同的。auto声明的变量必须被初始化,以使编译器能够从其初始化表达式中推导出其类型。这个意义上,auto并非一种类型声明,而是一个类型声明时的“占位符”,编译器在便已是亲会将suto替代为变量实际的类型。
 
使用auto也能在一条语句中声明多个变量,因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样。
 
但是,上面这么简单的变量声明类型,不建议用auto关键字,而是应更清晰地直接写出其类型。
因为auto关键字更适用于类型冗长复杂、变量使用范围专一时,使程序更清晰易读。例如上面的简洁之道中的例子那样复杂的表达。
 

使用之途:

 
1.范围for循环中用auto
for (auto & i : list){//对于list中的数据来说,i是一个引用,for里面的赋值语句将会改变list中数据
} for (auto i : list)
}
2.保存lambda表达式类型的变量声明:
auto ptr = [](double x){return x*x;};//类型为std::function<double(double)>函数对象
3.函数的返回类型(auto在C++14可以作为函数返回类型)
template<class T,class U>
auto fun(T x,U y)
{
return x*y;
}
这就是我分享的auto关键词,如果大家有什么更好的思路,欢迎分享交流哈。

更多分享,扫码关注我

C++隐式推导-auto关键词的更多相关文章

  1. Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL

    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3 ...

  2. Spark Mllib里的协调过滤的概念和实现步骤、LS、ALS的原理、ALS算法优化过程的推导、隐式反馈和ALS-WR算法

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 (广泛采用) 协调过滤的概念 在现今的推荐技术和算法中,最被大家广泛认可和 ...

  3. C++11 - 类型推导auto关键字

    在C++11中,auto关键字被作为类型自动类型推导关键字 (1)基本用法 C++98:类型 变量名 = 初值;   int i = 10; C++11:auto 变量名 = 初值;  auto i ...

  4. 彻底理解c++的隐式类型转换

    隐式类型转换可以说是我们的老朋友了,在代码里我们或多或少都会依赖c++的隐式类型转换. 然而不幸的是隐式类型转换也是c++的一大坑点,稍不注意很容易写出各种奇妙的bug. 因此我想借着本文来梳理一遍c ...

  5. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  6. iOS中的隐式动画

    隐式动画就是指  在 非 人为在代码中 定义动画  而系统却默认  自带   的动画  叫做隐式动画. 比如  改变 图层  的颜色  位置  和   透明度  的时候    都会  产生附带的渐变的 ...

  7. 深入理解Scala的隐式转换系统

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码.   使用方式: 1. ...

  8. C#之隐式与显示类型转换

    今天在看一篇有关数据类型的文章的时候,无意间看到了两个关键词,"隐式转换"与"显示转换",然后突然想起了当初开始学编程的时候,也总是在代码编译的时候遇到这样的问 ...

  9. Android 8.0对隐式广播的进一步限制

    项目targetSdkVersion升级到26后,对应的的是Android O版本,即Android 8.0系统.经测试发现针对8.0及以上安卓版本手机,AndroidMainfest.xml中静态注 ...

随机推荐

  1. MAC与ARP缓存中毒介绍

    ARP 协议 用于地址解析,请求MAC地址. arp -a 或者 -n 查看ARP缓存表 ls(ARP) 查看scapy里的协议字段 ARP缓存中毒原理 ARP收到ARP请求报文,会将发送方的mac地 ...

  2. Face_to_object_design

    二.实例 掷骰子游戏:三粒骰子,掷两次,比较两次的结果. 1.提炼 提炼对象:三粒骰子.游戏 提炼对象的属性和功能:掷骰子.比较点数 骰子: 属性:点数 功能:随机获取一个1~6之间的整数值. 游戏: ...

  3. 【Spring】Spring中的Bean - 3、Bean的作用域

    Bean的作用域 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 通过Spring容器创建一个Bean的实例时,不仅可以完成 ...

  4. iostat的输出

    第一行显示的时子系统启动以来的平均值,接下来的报告显示了增量的平均值,每个设备一行 Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   ...

  5. Head First 设计模式 —— 15. 与设计模式相处

    模式 是在某情境(context)下,针对某问题的某种解决方案. P579 情景:应用某个模式的情况 问题:你想在某情境下达到的目标,但也可以是某情境下的约束 解决方案:一个通用的设计,用来解决约束. ...

  6. 【Linux】reverse mapping checking getaddrinfo for XXX.XXXX.com failed - POSSIBLE BREAKIN ATTEMPT!

    ------------------------------------------------------------------------------------------------- | ...

  7. ctfhub技能树—信息泄露—备份文件下载—.DS_Store

    打开靶机 查看页面信息 使用dirsearch进行扫描 访问该网页,下载文件 使用Linux系统打开文件 发现一个特殊文件,使用浏览器打开 拿到flag 二.使用Python-dsstore工具查看该 ...

  8. Ice系列--傻瓜式服务开发IceBox

    前言 相信大家在没有接触过框架之前,都自己或多或少的开发过一些应用服务.每个应用服务除了业务配置还有很多环境配置,资源配置等,这些跟部署相关的配置.服务跟配置文件是一种静态绑定的方式,更新配置还需要重 ...

  9. 前端知识(一)03 初识 ECMAScript 6-谷粒学院

    目录 一.ECMAScript 6 1.什么是 ECMAScript 6 2.ECMAScript 和 JavaScript 的关系 二.基本语法 1.let声明变量 2.const声明常量(只读变量 ...

  10. SQL Server和Oracle数据类型对应关系

    在工作中,有时会遇到跨库传输数据的情况,其中 SQL Server 和 Oracle 之间的数据传输是比较常见的情况. 因为 SQL Server 和 Oracle 的数据类型有些差异,这就要求我们在 ...