auto

话说C语言还处于K&R时代,也有auto a = 1;的写法。中文译过来叫自己主动变量。跟c++11的不同。C语言的auto a = 1;相当与 auto int a = 1;语句。 而C++11的auto是有着严格的类型推导出来的。曾经是这么写
int a = 1;
如今,编译器知道a是int型了。所以能够这么写
auto a = 1;
对于类型比較长的,如vector<string>::iterator这类的,能少敲些字符了。
假设只就这点作用。那么对编程实在没什么太大的益处。尽管自己主动类型推导对于编译器而言,是个高大上的话题。实际上,作用远远不止这点啊。适当地使用auto,会是你的代码更优雅,举例说明:

template <typename BuiltType, typename Builder>

void makeAndProcessObject (const Builder& builder)

{

    BuiltType val = builder.makeObject();

    // do stuff with val

}

从这代码来看,BuiltType的用处不大,但必须这么写才干编译过。

有了auto后,你能够这么写

template <typename Builder>
void makeAndProcessObject(const Builder& builder)
{
     auto val = builder.makeObject();
     // do stuff with val
}
这比上段代码就优雅些了。但是假设我要返回val的值呢?我们还是要传入BuildTye,由于c++11并没有提供通过返回值来推导返回类型(如今最终明确了。不是系统推导不出来,而是c++11没有提供罢了,c++14将会有这个特性。2014/5/14)
在看一遍auto a = 1;表达式。发现自己主动类型推导具有这种特点:它能够先不必知道是什么类型,而是依据后面的信息来推导。

假设我们能把返回类型先用auto取代,然后在给些信息让编译器推导出来。这就须要派上decltype了。


decltype


decltype意为declared Type,即声明类型。

decltype(x)表示从x中提取类型。因此。能够这样写:

decltype(x) y = x;
当然,x也能够换成一个表达式,decltype(builder.makeObject())将得到makeObject()返回的类型。

假设我们结合auto和decltype就能够写出例如以下代码:

template <typename Builder>
auto makeAndProcessObject(const Builder& builder) -> decltype(builder.makeObject())
{
     auto val = builder.makeObject();
     // do stuff with val
     return val;
}

这就是返回类型后置。从上面的样例能够看出。decltype对于模板编写会有所帮助。

假设不用自己写模板的话,也许用的并不多。


decltype这个特性,BS在2002年就提议标准化这类操作符了。gcc c++编译器于2008增加该特性。visual c++ 2010以扩展形式提供了该特性,到c++11才增加标准。而普及到大众程序猿的时间大概是2013前后吧。

可见,技术的发展也许快,然而这仅仅是局部性的。要普及到大众,速度就有点慢了。

想想人生真正奋斗的时间也就短短几十年,推广普及一个技术,真要消耗人的一生光阴。

如今的BS已经是白发苍苍矣。

初窥C++11:自己主动类型推导与类型获取的更多相关文章

  1. 初窥c++11:lambda函数及其用法

    转载于:点击打开链接 为什么需要lambda函数 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名.1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值.正因为有这样的需求 ...

  2. TypeScript 类型推导及类型兼容性

    类型推导就是在没有明确指出类型的地方,TypeScript编译器会自己去推测出当前变量的类型. 例如下面的例子: let a = 1; 我们并没有明确指明a的类型,所以编译器通过结果反向推断变量a的类 ...

  3. 《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导

    条款2: 理解auto自己主动类型推导 假设你已经读过条款1关于模板类型推导的内容,那么你差点儿已经知道了关于auto类型推导的所有. 至于为什么auto类型推导就是模板类型推导仅仅有一个地方感到好奇 ...

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

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

  5. C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则

    背景:    最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言:     ...

  6. C++11类型推导

    [C++11类型推导] auto 关键字.这会依据该初始化子(initializer)的具体类型产生参数: 除此之外,decltype 能够被用来在编译期决定一个表示式的类型. 参考:http://z ...

  7. C++11 类型推导decltype

    我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通 ...

  8. c++11——auto,decltype类型推导

    c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率.     auto和decltype的类型推导都是编译器在 ...

  9. C++拾遗(二)——初窥标准库类型

    本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直 ...

随机推荐

  1. 为WPF项目创建单元测试

    原文作者: 周银辉  来源: 博客园 原文地址:http://www.cnblogs.com/zhouyinhui/archive/2007/09/30/911522.html 可能你已发现一个问题, ...

  2. Javascript基本算法演练 Seek and Destroy

    转载自:http://aeroj-blog.logdown.com/posts/435808 Seek and Destroy You will be provided with an initial ...

  3. Linux学习十八之、善用判断式

    原文地址:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_3.php 善用判断式 在第十一章中,我们提到过 $? 这个变量所 ...

  4. iOS中UITextView键盘回收

    iOS开发中,发现UITextView没有像UITextField中textFieldShouldReturn:这样的方法,那么要实现UITextView关闭键盘,就必须使用其他的方法,下面是可以使用 ...

  5. CodeForces 540B School Marks(思维)

    B. School Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  6. C# base和this[转]

    new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键 ...

  7. Android创建启动画面[转]

    每个Android应用启动之后都会出现一个Splash启动界面,显示产品的LOGO.公司的LOGO或者开发者信息.如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥 ...

  8. [置顶] ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十四)

    结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言 ...

  9. R实战读书笔记四

    第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括例如以下. 一图胜千字,人们从视觉层更易获取和理解 ...

  10. servlet上传文件报错(一)

    1.详细报错例如以下: org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multip ...