码迷,mamicode.com
首页 > 其他好文 > 详细

类型别名、auto类型说明符和decltype类型说明符初探

时间:2015-08-13 22:28:46      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:c++   类型别名   auto   decltype   

类型别名

       类型别名顾名思义是某种类型的另一个名字,常用于简化类型,易于理解和使用。

       传统方法是使用关键字 typedef 。新标准规定使用别名声明(alias declaration)来定义类型别名。

using zhengxing = int;


 

       如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句中往往会让人理解出错。

typedef char *cstring;//cstring 是 char* 的别名
const cstring cstr = 0;//cstr 是指向 char 的常量指针


 

       const出现在声明的最左边,因此是给定类型的修饰符,cstring 是指向 char 类型的指针,因此const cstring 是指向char类型的常量指针。这里不能将类型别名 cstring 还原并带入到声明语句中去再理解声明。当使用 cstring 作为声明语句中的类型时,cstr 的基本数据类型时指针(cstring是指向 char 的指针),当还原后原声明语句如下:

const char * cstr = 0;//错误,cstr 是指向 char 常量的指针。


       偷梁换柱,const char 成了基本数据类型,这显然是错误的。

 

auto 类型说明符

       有些时候程序要用到表达式(常量是一种特殊的表达式)给对象赋值,然而很多时候表达式是什么类型的时候并不知道,这时候可以使用 auto 关键字让编译器来识别表达式的值。

       auto 对引用还是很老实,讲规矩~引用是对象的别名,使用引用的时候用的是引用绑定的对象并不是引用本身,所以编译器用引用绑定的对象作为 auto 的类型。 

       auto 一般会忽略顶层 const 但是 底层 const 会保留。

const int ci = 0,&cr = ci;
auto a = ci;//a 是int型(忽略顶层 const)
auto b = cr;//b 是int型,虽然cr是底层 const,但实际使用的是引用的对象ci
auto c = &ci;//c 是指向整形常量的指针(对常量对象取地址是底层 const) 


       

       如果希望推断出的类型为顶层 const ,需要在 auto 前添加 const 显示的指出。

       如果将引用的类型设为 auto ,原本的初始化规则仍然适用。

 

decltype 类型说明符

       有时候希望从表达式类型推断出要定义的变量的类型,但是又不想用表达式的值初始化变量。C++11新特新引入了 decltype ,编译器分析表达式的类型却不实际计算表达式的值。     

       如果 decltype 使用的表达式是一个变量,则 decltype 返回该变量的类型(包括顶层const引用)。 引用从来都是作为其绑定对象的别名出现,只有对 decltype 动了心,丢了原则,亲自上阵技术分享

       如果 decltype 使用的表达式不是一个变量,则 decltype 返回该表达式结果的类型

int i = 2015,*p = &i, &r = i;
decltype(r+0) a;//正确,r+0 的结果是整数,所以 a 是整形
decltype(*p) b;//错误,b是引用类型必须初始化(当表达式的内容是解引用操作时,decltype返回引用类型<img alt="尴尬" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif" />)


 

       如果 decltype 使用的表达式是一个变量,若变量不加括号,decltype 返回变量的类型,若变量加括号,则结果必然是引用类型。

 

      

版权声明:本文为博主原创文章,未经博主允许不得转载。

类型别名、auto类型说明符和decltype类型说明符初探

标签:c++   类型别名   auto   decltype   

原文地址:http://blog.csdn.net/yiyi__baby/article/details/47616963

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!