总述
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. 孟德尔随机化(Mendelian Randomization) 统计功效(power)和样本量计算

    孟德尔随机化(Mendelian Randomization) 统计功效(power)和样本量计算 1 统计功效(power)概念 统计功效(power)指的是在原假设为假的情况下,接受备择假设的概率 ...

  2. 你真会看idea中的Log吗?

    在项目中提交代码时,我们时常忘了自己是否已经update代码或者push代码了,或者以为自己push,但是别人说你的代码没push,其实可以通过idea的Log日志中查看,你会发现里面有三种颜色的标签 ...

  3. MySQL多版本并发控制——MVCC机制分析

    MVCC,即多版本并发控制(Multi-Version Concurrency Control)指的是,通过版本链维护一个数据的多个版本,使得读写操作没有冲突,可保证不同事务读写.写读操作并发执行,提 ...

  4. alter column和modify column

    5.6中,发现其实alter column 和更改modify column 步骤是一样的 mysql> create table xs(name varchar(12),age int def ...

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

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

  6. XSS - Labs 靶场笔记(上)

    上周在网上看到的一个XSS平台,刷一波<doge Less - 1: 1.进入主界面,由图二可知是GET请求,提交name=test,回显在页面 2.查看源代码可知 没有做任何过滤,显然存在反射 ...

  7. qt for webassembly环境搭建图文教程

    一.前言 从Qt5.14开始,官方的在线安装提供了qt for webassembly构建套件,这对很多小白来说绝对是个好消息,也绝对是个好东西,好消息是不用再去交叉编译自己生成qt for weba ...

  8. 如何在 Blazor WebAssembly中 使用 功能开关

    微软Azure 团队开发的 功能管理 (Feature Management) 包 Microsoft.FeatureManagement可用于实现 功能开关,可以通过 功能开关 特性动态的改变应用程 ...

  9. Centos 7.x系统下忘记用户登录密码,重置root密码的方法

    转载的,作为一个参考保存.谢谢:https://blog.csdn.net/userpass_word/article/details/81807316 1.开机后进入以下界面,然后按Esc或者E键编 ...

  10. NIO非阻塞网络编程原理

    NIO非阻塞网络编程原理 1.NIO基本介绍 Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API.从 JDK1.4 开始,Java 提供了一系列改进的 输 ...