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. ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK

    最近写一个程序,需要在用户模式下关中断,但ARM 7的体系结构决定了中断必须在特权模式下才可以更改,所以想到使用ARM的软中断来实现关中断和开中断. 使用软中断,首先要有硬件指令的支持.ARM有条指令 ...

  2. 翻书的效果:FMX.TSwipeTransitionEffect Animation

    This example shows how to use a TSwipeTransitionEffect transition and a TPathAnimation to simulate t ...

  3. Activitys, Threads, & Memory Leaks

    Activitys, Threads, & Memory Leaks 在Android编程中,一个公认的难题是在Activity的生命周期如何协调长期运行的任务和避免有可能出现的内存泄漏问题. ...

  4. css案例学习之继承关系

    代码 <html> <head> <title>继承关系</title> <style> body{ color:blue; /* 颜色 * ...

  5. The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...

  6. 【Android】自带Theme

    [Android]自带Theme android之uses-permission   在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...

  7. 高性能 TCP &amp; UDP 通信框架 HP-Socket v3.2.3 正式宣布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包括服务端组件.client组件和 Agent 组件.广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#. ...

  8. 前端入门HTML5扩展知识(一)

    一. 请描述一个网页从开始请求到最终显示的完整过程? 1.  在浏览器中输入网址: 2.  发送至 DNS 服务器并获得域名对应的 WEB 服务器的 IP 地址: 3.  与 WEB 服务器建立 TC ...

  9. .net通用权限框架B/S(二) 数据库设计

    1.组织机构---员工是1:n关系 2.角色---员工n:n 3.角色--导航菜单n:n 4.操作权限(id)---导航菜单(prms_id)n:n   [此处是n:n关系正常是生成第三张表存放多对多 ...

  10. poj1995-快速幂取模

    #include<iostream> #define LL long long using namespace std; //快速幂算法 LL pow(LL a,LL b,int m){ ...