auto和decltype的用法总结

本博客转载自:https://www.cnblogs.com/XiangfeiAi/p/4451904.html

1 auto

1.1 auto的作用

一般来说, 在把一个表达式或者函数的返回值赋给一个对象的时候, 我们必须要知道这个表达式的返回类型, 但是有的时候我们很难或者无法知道这个表达式或者函数的返回类型. 这个时候, 我们就可以使用auto关键字来让编译器帮助我们分析表达式或者函数所属的类型. 比如:

auto item = val1 + val2;
auto red = LayerColor::create(Color4B(255, 100, 100, 255), 200, 100);

如果val1和val2都是int类型, 那么item也是int类型, 如果val1和val2是double类型, 那么item就是double类型. 而create()的返回值类型有可能会很复杂, 我们可以不用管, 这就使我们编程更加方便简单

1.2 auto和const

auto会忽略掉顶层const, 保留底层const. 举例:

const int i = 5;
auto a = i;        // 变量i是顶层const, 会被忽略, 所以b的类型是int
auto b = &i;    // 变量i是一个常量, 对常量取地址是一种底层const, 所以b的类型是const int *

因此, 如果希望推断出的类型是顶层const的, 那么就需要在auto前面加上const:

const auto c = i;

1.3 auto和引用

① 如果表达式是引用类型, 那么auto的类型是这个引用的对象的类型.

int i = 2, &ri = i;
auto k = ri;            // k是int类型, 而不是引用类型

② 如果要声明一个引用, 就必须要加上&, 如果要声明为一个指针, 既可以加上* 也可以不加 *.

int i = 3;
auto &refi = i;        // refi是一个int类型的引用
auto *p1 = &i;       // 此时推断出来的类型是int, p1是指向int的指针
auto p2 = &i;        // 此时推断出来的类型是int*, p2是指向int的指针

2 decltype

2.1 decltype的作用

decltype只是为了推断出表达式的类型而不用这个表达式的值来初始化对象.

decltype(func()) sum = x; // sum的类型是函数func()的返回值的类型, 但是这时不会实际调用函数func()
int i = 0;
decltype(i) j = 4; // i的类型是int, 所以j的类型也是int

2.2 decltype和const

不论是顶层const还是底层const, decltype都会保留

const int i = 3;
decltype(i) j = i; // j的类型和i是一样的, 都是const int

2.3 decltype和引用

① 如果表达式是引用类型, 那么decltype的类型也是引用

const int i = 3, &j = i;
decltype(j) k = 5; // k的类型是 const int &

② 如果表达式是引用类型, 但是想要得到这个引用所指向的类型, 需要修改表达式:

int i = 3, &r = i;
decltype(r + 0) t = 5; // 此时是int类型

③ 对指针的解引用操作返回的是引用类型

int i = 3, j = 6, *p = &i;
decltype(*p) c = j; // c是int类型的引用, c和j绑定在一起

④ 如果一个表达式的类型不是引用, 但是我们需要推断出引用, 那么可以加上一对括号, 就变成了引用类型了

int i = 3;
decltype((i)) j = i; // 此时j的类型是int类型的引用, j和i绑定在了一起

auto和decltype的用法总结相关推荐

  1. C++自动类型推导 : auto 与 decltype 用法

    基本用法与区别 auto 总是推导出"值类型",绝不会是"引用",如果有引用,auto会把引用去掉,推导出值类型: auto 可以附加上 const.volat ...

  2. 有auto为什么还要decltype ?详解decltype的用法

    decltype用法 auto和decltype推导类型的区别 decltype用法: 1.decltype变量 2.==decltype表达式== 2.1 表达式做右值 2.2 表达式能做左值 3. ...

  3. C++新特性探究(6.1):auto和decltype的类型推断差异所在

    例 附上例代码: #include <iostream> using namespace std;int Max(int a,int b) {return a>b?a:b; }cla ...

  4. stdmove 跟 左键引用 区别_C++ auto和decltype的区别

    通过<C++ auto>和<C++ decltype>两节的学习,相信大家已经掌握了 auto 和 decltype 的语法规则以及使用场景,这节我们将 auto 和 decl ...

  5. auto与decltype

    1.C++11 使用 auto 关键字来支持自动类型推导 auto 类型推导的语法和规则 auto 关键字基本的使用语法如下: auto name = value; name 是变量的名字,value ...

  6. C++11 auto和decltype关键字

    auto 可以用 auto 关键字定义变量,编译器会自动判断变量的类型.例如: auto i =100; // i 是 int auto p = new A(); // p 是 A* auto k = ...

  7. 浅谈auto与decltype函数的区别

    auto与decltype都是C++里处理类型的指示符,它们的使用场景如下: auto decltype 在我们需要给变量赋值的时候,简单的程序往往可以通过观察得出表达式的类型,但在一些大型程序中这样 ...

  8. 《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结

    1.using和typedef(作用:定义类型别名) 1)typedef和using都可以用来定义一个类型别名,二者在类型别名上定义没有区别.只是需要注意的是类型和类型别名的顺序,使用typedef定 ...

  9. C++ auto和decltype关键字

    可以用 auto 关键字定义变量,编译器会自动判断变量的类型.例如: auto i =100; // i 是 int auto p = new A(); // p 是 A* auto k = 3434 ...

最新文章

  1. shiro系列二、身份验证和授权
  2. html文本长度不一样的对齐,关于html:文本在中间不对齐
  3. 浓缩版java8新特性
  4. List接口的常用方法以及ArrayList/LinkedList源码分析
  5. python爬虫酷狗_python爬虫教程:爬取酷狗音乐,零基础小白也能爬取哦
  6. uni-app 小程序多图上传
  7. List分组 用于客服对话分组场景
  8. Solaris11操作命令汇总
  9. 小封装、高通流 TVS 管 UN1K/2K/3K Series
  10. mysql免安装百度云_Mysql免安装配置
  11. 解决Microsoft Visual Studio 2010 Macro宏无法运行
  12. 九龙证券|这一刻,资本市场进入全新时代!
  13. 看板的作用是什么?任务看板如何跟进
  14. 老友记台词中英文对照Part1
  15. 【原创】畅言实现单点登录的设计流程和技术细节(2/2)
  16. location.hash 原生js页面跳转/路由
  17. 『Java安全』反序列化-CC7反序列化漏洞POP链分析_ysoserial CommonsCollections7 PoC分析
  18. 苹果cmsv10仿韩剧网好看的高端简约免费自适应模板
  19. 万象网管的密码藏身之处
  20. matlab 稀疏随机矩阵,MATLAB中的稀疏数组

热门文章

  1. 图像处理随笔——soft-nms
  2. php修改sessiob时间_php中session过期时间设置
  3. vb子程序未定义怎么改怎么办_vb中总提示子程序或函数未定义
  4. 考研c语言复试常问问题,2018考研复试常问的十个问题及回答指导
  5. (03)两个模型的交集、并集、差集
  6. centos光盘修复引导_CentOS 6.5 修复grub引导
  7. android 链式结构,Android 架构师之路10 设计模式之责任链模式
  8. markdown一边写一边预览_MarkDown使用笔记
  9. python编写代码运用递归画图形_python数据结构与算法 22 递归图形
  10. mysql创建表的默认大小_mysql InnoDB建表时设定初始大小的方法