C++11:auto与decltype

1、auto类型说明符号

auto类型说明符号是C++11新标准引入的类型说明符号,用于让编译器替程序员去分析表达式所属的类型,以下便记录auto关键字的用法与注意点。

(1)auto定义的变量必须有初始值

因为auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。

int i = 1; int &j = i;
auto val0 = 0, *p = &i;  //正确
auto val1;               //错误
auto val2 = 0, val3 = 3.0; //错误,val2,val3的类型不一致
auto val4 = i;           //正确,i是整数j的引用,此时val4的类型是整型

(2)auto与const

auto一般会忽略掉顶层const,而底层的const则会保留下来。

const int i = 0, &j = i;
auto a = i, b= j;  //a,b都是整数,不是常量
auto c = &a;  //c是一个整型指针,
auto d = &i;   //d是一个指向整数常量的指针(对常量取地址相当于int* const,为底层const)

(3)auto与引用

可以将引用的类型设置为auto,此时的初始化规则和引用的一样。

int i = 0;
auto &a = i; //正确
auto &b = 0; //错误,不可以为非常量绑定字面值
const auto &c = i; //正确,c为常引用

(4)auto与动态分配

可以用auto来推断初始化器的类型,但是只有当初始化器中的类型是单一的时候才行。

auto p1 = new auto(obj);   //正确,此时p1是obj类型的指针类型,obj*
auto p2 = new auto{a,b,c}; //错误,不与花括号一起使用,并且括号中只能有一个初始化器

auto不能用于分配数组

auto arr[] = { 1,2,3 }; //错误,auto不能出现在顶级数组类型中

(5)auto与函数声明与尾置返回类型

尾置返回类型也是C++11新标准引入的,任何函数声明都可以使用尾置返回类型,对于返回类型比较复杂的函数比较有效,比如返回类型是数组的指针或者数组的引用,在返回类型处可以用auto代替。

auto func(int i) -> int(*)[10];

func接受一个int类型的实参,返回一个指针,该指针指向含有十个整数的数组

2、decltype类型说明符号

decltype类型说明符号是C++11新标准引入的类型说明符号,与auto的区别为:在只想推断出表达式的类型,但是不想用其值进行初始化的时候,用decltype。

(1)decltype定义的变量可以不初始化

decltype(f()) a;  //正确,decltype定义变量可以没有初始值,类型为函数f()的返回值类型

(2)decltype与const

const int a = 0,  &b = a;
decltype(a) c = 0; //正确,c的类型为const int
decltype(b) d = c; //正确,d的类型为const int&
decltype(b) e;  //错误,e的类型为const int&,必须初始化

从上面的例子可以看到,decltype不会忽略顶层的const,而是保留,这是和auto的一个区别。

(3)decltype与引用

在上面已经知道decltype计算出来的类型可以是引用,现在来看几个和引用、指针的例子

int i = 1, *p = &i, &r = i;
decltype(*p) a = i; //decltype推断出的*p的类型是引用,因此a的类型是int&,必须初始化
decltype(r+0) b; //r的类型是引用,但是r+0表达式计算之后返回的类型是int,因此b的类型是int,可以没有初始值。

(4)decltype与括号

decltype内层如果有多层括号,那推断出的类型必定是引用类型,必须有初始值。

int i = 0;
decltype((i)) a;//错误,a的类型是int&,必须初始化

(5)decltype与函数返回类型

decltype可以用于函数的返回类型定义处。

int odd[] = {1,3,5,7,9};
int even[] = {0,2,4,6,8};
decltype(odd) *arrptr(int i)
{
  return (i%2) ? &odd : &even;
}

上述的例子中,decltype(odd)的类型是整型数组(decltype不负责把数组类型转化成指针),而后的*号则表示返回值是指向一个整型数组的指针。

总结

C++11提供的auto和decltype类型说明符号,可以简化在定义变量,函数返回类型和推断表达式值的类型等可以提供很大的便利。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,506评论 1 51
  • 基本内置类型 算术类型字符整型布尔值浮点数 空类型(void) 算术类型 带符号类型和无符号类型int、short...
    2625K阅读 3,127评论 0 1
  • 2.变量和基本类型 3.字符串、向量和数组 4.表达式 5.语句 2.变量和基本类型 c++的算术类型: 一个ch...
    暮落晴空阅读 643评论 0 0
  • 1. C++基础 大多数编程语言通过两种方式来进一步补充其基本特征1)赋予程序员自定义数据类型的权利,从而实现对语...
    王侦阅读 745评论 0 3
  • 2019年的3月27号,姥姥走了。 姥姥生病有半年多,得了舌头癌,我第一次知道有这样的病症。刚开始影响说话,后来影...
    _扎布苏阅读 210评论 0 0