总述
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. git切换分支后远程提交报错

    切换分支后提交,报错如下 解决办法

  2. CentOS8_在线安装_网络源_网络镜像源填写格式_以及其他笔记

    CentOS8_在线安装_网络源_网络镜像源填写格式_以及其他笔记 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-10-1. 参考: Centos8.0.1905 在线安装源选择 ...

  3. 【模拟】P1143进制转换

    题目相关 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入格式 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A- ...

  4. Spark推荐系统实践

    推荐系统是根据用户的行为.兴趣等特征,将用户感兴趣的信息.产品等推荐给用户的系统,它的出现主要是为了解决信息过载和用户无明确需求的问题,根据划分标准的不同,又分很多种类别: 根据目标用户的不同,可划分 ...

  5. 剑指offer 面试题9.1:用两个队列实现栈

    题目描述 使用队列实现栈的下列操作:push(x) -- 元素 x 入栈:pop() -- 移除栈顶元素:top() -- 获取栈顶元素:empty() -- 返回栈是否为空: 编程思想 利用双队列实 ...

  6. git revert 回退已经push的内容

    如题,在日常的开发过程中,可能有组员不小心一下子吧文件修改,需要进行回退 回退主要涉及到2种命令,一种是git reset 一种是 git revert git reset 会修改git log提交历 ...

  7. leetcode230. 二叉搜索树中第K小的元素

    题目链接: https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/ 题目: 给定一个二叉搜索树,编写一个函数 kthSmalle ...

  8. 在Jetbrain IDE中自定义TODO功能

    好的IDE能为开发以及学习源码带来效率的提升,今天要介绍的就是Jetbrain家族中IDE自带的TODO功能,我认为利用好它,能够大大的提升阅读源码的效率. 假设我现在需要去阅读源代码,看了半天我终于 ...

  9. JMS监听Oracle AQ

    该文档中,oracle版本为11g,jdk版本1.8,java项目为maven构建的springboot项目,springboot的版本为2.1.6,并使用了定时任务来做AQ监听的重连功能,解决由于外 ...

  10. 避免用using包装DbContext【翻译】

    EF和EF Core 的DbContext类实现IDisposable接口.因此,很多最佳编程实践中都建议你将它们放在一个using()块中.不幸的是,至少在Web应用程序中,这样做通常不是一个好主意 ...