Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype
条款2、理解auto型别推导
对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的。只有一种特例情况。
我们先针对auto和模板型别推导一致的情况进行讨论:
//某变量采用auto来声明的时候,其中auto就扮演了模板中的T这个角色,而变量的型别修饰词则对应函数形参param
auto x = 27;//其中T对应auto、param也对应auto
const auto cx = x;//T对应auto,param对应const auto
const auto& rx = x; //param对应const auto&
而对于auto与模板的区别主要在于大括号的使用上:
//对于auto而言
auto x{27};
auto x = {27};
//这两种方式都是声明了类型为std::initializer_list<int> 含有单个值为27的元素。
auto x = {0.1,1,2}//大括号里面的类型不一样,无法推导,所以这种声明方式会报错。
//对于模板而言
template<typename T>
void f(T param)
f({11,23,9})//报错,就算类型一致,模板型推导也不会推导成std::initializer_list<int>这个点为两者的区别所在
除此之外,对于函数的返回值,和lambda表达式的形参,在c++14中auto可以充当关键字,但是要注意的是此时的auto使用的推导方式是模板方式。也就是说返回值不能用大括号括起来。
条款2、理解decltype
1、其实对于decltype,没什么需要多说的。他就像当与一只鹦鹉。你给他什么,他就说什么。当然虽然有时候他的话也会让你大吃一惊。不过那也只是特例。
主要需要新学习的是c++11中的返回值型别尾序语法,可能您见过,或者很熟悉。
例如:
template<typename Container, typename Index>
auto authAndAccess(Container& c, Index i) ->decltype(c[i])
{
authenticateUser();
return c[i];
}
该函数的返回值类型在最后,这样做的好处是在指定返回值类型的时候可以用到函数形参。
在c++14中这种用法可以用auto来替代但是因为auto的推导型别和模板类似在条款1中有说明,会忽略形参引用。
但是c++中 使用decltype(auto) 来代替auto作为函数返回值,完美的解决了这个问题。
2、对于参数是表达式的情况下,decltype的返回值总会是引用类型。比如:
int x;
decltype((x))//返回值结果为int&
Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype的更多相关文章
- Effective Modern C++  条款2:理解auto型别推导
		在条款1中,我们已经了解了有关模板型别的推导的一切必要知识,那么也就意味着基本上了解了auto型别推导的一切必要知识. 因为,除了一个奇妙的例外情况,auto型别推导就是模板型别推导.尽管和模板型别推 ... 
- 《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导
		条款2: 理解auto自己主动类型推导 假设你已经读过条款1关于模板类型推导的内容,那么你差点儿已经知道了关于auto类型推导的所有. 至于为什么auto类型推导就是模板类型推导仅仅有一个地方感到好奇 ... 
- Effective Modern C++  条款1:理解模板型别推导
		成百上千的程序员都在向函数模板传递实参,并拿到了完全满意的结果,而这些程序员中却有很多对这些函数使用的型别是如何被推导出的过程连最模糊的描述都讲不出来. 但是当模板型别推导规则应用于auto语境时,它 ... 
- Effective Modern C++翻译(4)-条款3:了解decltype
		条款3 了解decltype decltype是一个有趣的东西,给它一个变量名或是一个表达式,decltype会告诉你这个变量名或是这个表达式的类型,通常,告诉你的结果和你预测的是一样的,但是偶尔的结 ... 
- 《Effective Modern C++》翻译--条款4:了解怎样查看推导出的类型
		条款4:了解怎样查看推导出的类型 那些想要了解编译器怎样推导出的类型的人通常分为两个阵营. 第一种阵营是实用主义者.他们的动力通常来自于编敲代码过程中(比如他们还在调试解决中),他们利用编译器进行寻找 ... 
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
		条款6:当auto推导出意外的类型时,使用显式的类型初始化语义 条款5解释了使用auto来声明变量比使用精确的类型声明多了了很多的技术优势,但有的时候,当你想要zag的时候,auto可能会推导出了zi ... 
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
		条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ... 
- Effective Modern C++翻译(6)-条款5:auto比显示的类型声明要更好
		在概念上说,auto关键字和它看起来一样简单,但是事实上,它要更微妙一些的.使用auto会让你在声明变量时省略掉类型,同时也会防止了手动类型声明带来的正确性和性能上的困扰:虽然按照语言预先定义 ... 
- item 2: 理解auto类型的推导
		本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你已经读过item 1的模板类型推导,你已经知道大部分关于au ... 
随机推荐
- 17.JAVA-常用总结
			for另一种写法 for(UserBean bean : list){ //for循环取出list中每个成员,并赋给bean变量 System.out.println(bean.getName()); ... 
- Dubbo部分知识点总结
			Dubbo部分 Dubbo工作原理 dubbo工作原理第一层:service层,接口层,给服务提供者和消费者来实现的第二层:config层,配置层,主要是对dubbo进行各种配置的第三层:proxy层 ... 
- MeteoInfoLab脚本示例:subplot
			subplot命令可以自动等间距分配多个坐标系(Axes),命令中有三个参数,前两个定义了行数和列数,第三个指定了当前的坐标系(Axes),绘图命令是作用在当前坐标系中的. 脚本程序: def f(t ... 
- linux centos 05
			centos7安装mariadb 1.yum 得配置yum源,配置阿里云的 两个 yum源 ,阿里云的yum源中,会有 mariadb的软件包 阿里云的yum仓库中,mariadb版本如下 mar ... 
- go sync.WaitGroup
			package mainimport ( "fmt" "sync")func say(i int ,wg *sync.WaitGroup) { defer wg ... 
- fish_redux使用详解---看完就会用!
			说句心里话,这篇文章,来来回回修改了很多次,如果认真看完这篇文章,还不会写fish_redux,请在评论里喷我. 前言 来学学难搞的fish_redux框架吧,这个框架,官方的文档真是一言难尽,比fl ... 
- Vue踩坑日记-This dependency was not found:element-ui.js
			该问题为在Vue启动项目时候报错找不到element-ui模块 解决办法:打开CMD 控制台 CD到项目根目录 我的目录(C:\Users\Administrator\Desktop\cms-heli ... 
- 2018HUAS_ACM暑假比赛5题解
			目录 Problem A Problem B Problem C Problem D Problem E Problem F Problem A 思路 这是一道带权并查集问题 因为只有三种种类,我们分 ... 
- 微信小程序的账号找回。
			之前注册过微信小程序,好久没用了,马上要开发微信小程序了,我今天登陆了一下突然发现 然后点击账号找回,按照流程同意点击下一步,到第二部时要输入搜索框里的提示. 这时的我早已忘了,百度搜了一下如何找回原 ... 
- 解决Android RadioGroup跑到输入法上面
			Android开发过程中,发现一个小问题,当我们点击屏幕下面的输入框时,我们的RadioGroup会跑到输入法的上面去,如下图 两种解决方法 1.Manifest.xml文件activity标签中添加 ... 
