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. DIV+CSS规范命名

    一.命名规则说明: 1).所有的命名最好都小写2).属性的值一定要用双引号("")括起来,且一定要有值如class="divcss5",id="div ...

  2. poj3077---进位

    #include <stdio.h> #include <stdlib.h> #include<string.h> ]; ]; int main() { int n ...

  3. aix rksh 执行CLI命令行限制

    su padmin -C "lsdev -dev hdisk9 -attr| grep unique_id"rksh: lsdev: 0403-006 Execute permis ...

  4. hdu 5586 Sum(dp+技巧)

    Problem Description There )mod10007.After that,the sum of n numbers should be as much as possible.Wh ...

  5. How to change a product dropdown attribute to a multiselect in Magento

    First, update the attribute input type to multiselect: UPDATE eav_attribute SET entity_type_id ', at ...

  6. 精通CSS+DIV基础总结(一)

    这段时间学习了玩了DIV+CSS的视频,感觉效率不高.前边的Javascript总结的不好,但是看了后边的JQuery,觉得学习的再多一点,再进行Javascript的总结.DIV+CSS总结,估计会 ...

  7. 服务端API的OAuth认证实现

    http://stackoverflow.com/questions/12499602/body-joints-angle-using-kinect?rq=1 新浪微博跟update相关的api已经挂 ...

  8. HDU 1423 Greatest Common Increasing Subsequence(最长公共上升LCIS)

    HDU 1423 Greatest Common Increasing Subsequence(最长公共上升LCIS) http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. 3.C#/.NET编程中的常见异常(持续更新)

    1.Object reference not set to an instance of an object. 未将对象引用(引用)到对象的实例,说白了就是有个对象为null,但是你在用它点出来的各种 ...

  10. sqlserver数据库差异比较

    相信这个功能会对好多网友有帮助,不得不说vs的功能很强大,废话不多说,切入正题 我们可以使用 vs自带的工具比较两个数据库的架构差异和数据差异,这篇文章只是写了架构的差异,我相信看完以后, 如何进行数 ...