注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++11及BOOST特性之十七decltype和auto的使用  

2014-07-11 09:46:44|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++11BOOST特性之十七decltypeauto的使用

Decltyep这个关键字也是新引入的,他的好处是不言而喻的,在很多的场合下,并不需要主动的去认知数据的类型,比如在C#语言中的VAR类型等。这样做有很大的方便性,可以简化编程的复杂度。提高效率。

在前面总结的博文中也提到过,decltype这个关键字可以和静态断言一起配合在模板里使用,但是他的作用还不只这些,还有更多的。看下面的例子:

   Auto    _table = 10;

   Int u; double  _t;

   Decltype(u*t)  _c = 100;

很简单的例子,但是把基本的应用方式说清楚了。然后看下面的说明:

 

auto关键字和decltype关键字都可以做为类型推导,只是auto一般是应用在变量的声明中而且必须可以自动推导出数据类型才可以,而decltype则可以对值,表达式等的类型动态推导出数据类型,需要注意的是,在编译期时,这个关键字并不会引起数据的计算,看下面的例子。

auto  _test = 0; //这是正确的

auto  _test1;

_test1= 0; // 这是错误的,因为在申明时无法推导类型

对于decltype有如下规则

如果表达式expression是一个变量,那么就是这个变量的类型。

如果表达式expression是一个函数,那么就是这个函数返回值的类型。

如果不符合12,如果expression是左值,类型为T,那么decltype(expression)T&;如果是右值,则是T。看下面的详细说明:

1、如果表达式是一个函数表达式,则decltype给出的类型表示返回值的类型

Int Test(int a,int b){return a+b;}

Decltype(Test(1,2))   _test = 8;

2、如果表达式是一个左值类型,那么 decltype 给出的类型为表达式左值引用类型。

struct  A { int  _a; }; 

 

int  _test = 3; 

const A* a = new M(); 

decltype( (a->_a) )   Ref = _test;

3、前面提到过,decltype 不会执行表达式,可是auto会,前者只是推导一下表达式的类型。

 Int test();       decltype(test()) var = 6;

4、在模板中的应用

template<class T, class U> 

auto Multiply(T t, U u) -> decltype(u*t) //注意:推导出的返回值 必须放到函数声明的后面。

{  

   return u*v; 

强大的C++开始发力了,在被C#,JAVA,LUA,GO等各种不断前进的语言的逼迫下,C++终于有所动作,随着久久不能定型的C++0X最终成了C++11C++14也完成了定稿,C++17也开始了动作,并且C++的大牛们放言,这种速度会一直操持下去。

VC2013一开始便关注于C++14GCC4.9完美的支持了C++11GCC4.8.1支持的也不错,但是有一些BUG),Clang/LLVM3.3也完全支持了C++11,随着主流的编译器开始支持C++1XC++或许还有更美好的明天。

  评论这张
 
阅读(530)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017