文章目录

  • 获取表达式的类型
  • 推导规则
  • 返回类型后置
  • 高级用法

获取表达式的类型

在编写程序的过程中,我们可能会有一种需求,就是希望可以根据一个变量的类型,来定义具有相同类型的变量。例如定义int x = 0;,那么我们是否可以不使用int关键字,仅使用x就定义一个新的整型变量y呢?

答案是可以的,C++11新增的decltype关键字就是干这个用的。上述需求用代码实现如下:

int x = 0;
decltype(x) y = 2; // y的类型为int

decltype是在编译期用来推导表达式类型的。其语法格式为:decltype(expression)。大家可以看到,decltype是可以对一个表达式取类型的,并不仅是单个的变量。所以,把形式再扩展一下:

int x = 0;
decltype(x) y = 2;
decltype(x + y) z = 3; // z的类型为int

到这一步,相信大家已经可以基本掌握其特性,在工作中能运用了。当然,仅知道这些还是不够的,作为C++程序员怎么能停下探索的脚步呢。

推导规则

decltype的推导规则,是面试中最容易挖坑的地方。你要是不信,那就先回答下面这些问题吧:

const int func_one();
decltype(func_one()) a1 = 0; // a1是什么类型?struct TestData { int x;};
cosnt TestData b_node = TestData();
decltype(b_node.x) b1 = 0; // b1是什么类型?
decltype((b_node.x)) b2 = b1; // b2是什么类型?int n = 0, m = 0;
decltype(n + m) c1 = 0; // c1是什么类型?
decltype(n += m) c2 = c1; // c2是什么类型?

注释中有五个问题,如果你全都答对而且不是蒙的,那请开班授课吧,我会第一个报名。先公布一下答案,看看自己答对了多少吧。

a1: int
b1: int
b2: const int &
c1: int
c2: int &

如果这个答案让你觉得有些晕头转向,不要紧,先来看下规则描述吧:

  1. 如果expression表达式是标识符、类访问表达式,decltype(exp)和exp的类型一致;
  2. 如果expression是函数调用,则decltype(exp)和返回值的类型一致;
  3. 其他情况,如果expression是一个左值,则decltype(exp)是exp类型的左值引用,否则和exp类型一致。

现在,将规则理解之后,再看一遍代码和答案,是否找到规律了呢?相信在面试中遇到这样的问题,你已经可以应对自如了。

返回类型后置

在说明decltype的一个高级用法之前,我们先了解C++11的一个新特性,就是函数返回类型后置。与之相对的,就是返回类型前置,这是我们最熟悉的函数声明格式。例如:int foo();

而返回类型后置的示例如下:

auto foo() -> int {return 0;
}

在上面的代码中,auto关键字是一个占位符,int是其实际返回类型。初看起来,后置声明与前置声明在功能上是一样的,那它难道是一个多余的设计吗?它当然自有用武之地。

在需要返回比较复杂的类型时,使用后置式声明可以简化代码并使其可读性更好。例如要返回的类型是函数指针,前置式声明就必须先用typedef进行预定义,否则语法不允许。而后置式声明则可以直接实现,无需预定义,如下代码所示。

int exam(bool b) {int ret = -1;if (b) {ret = 0;}else if (!b) {ret = 1;}return ret;
}
auto foo() -> int(*)(bool) {return exam;
}int main() {auto fn = foo();cout << fn(true) << endl;cout << fn(false) << endl;
}

高级用法

现在正式介绍decltype与函数返回类型后置相结合,在模板编程中的用法,就是用于推导函数模板的返回类型。之所以将此归为高级用法,也是因为模板在C++中虽然功能强大,但属实复杂不易理解。一般是编写基础功能库或是算法库时,使用到模板的特性。

先看一段示例代码:

template<class T1, class T2>
auto sum(T1 t1, T2 t2) -> decltype(t1 + t2) {return t1 + t2;
}int main() {auto ret = sum(4.6, 123);cout << ret << endl;
}

其精髓之处,就在于可以灵活支持T1与T2不同类型的组合,而不必为每种返回类型都去写一个实现。例如int+int, double+int, string+string等各种组合情况。

但如果是把decltype(t1 + t2)以前置写法替换auto,则会产生编译错误。道理很简单,编译器对t1+t2的参数类型还一无所知,只有在解析到返回值时,才能最终确定函数的返回类型,这就是decltype加上函数返回类型后置在模板编程中的妙用。

C++11精要学习:decltype的功能与使用相关推荐

  1. C++11新特性decltype

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105042574 C ...

  2. Visual C++ 11 中新的并发功能

    最新的 C++ 迭代(称为 C++11,在去年通过了国际标准化组织 (ISO) 的审批)形式化了一组新库和一些保留字以处理并发. 许多开发者以前都在 C++ 中使用过并发功能,但都是通过第三方的库,即 ...

  3. C++11之后的decltype类型指示符

    C++11之后的decltype类型指示符 一.什么是decltype类型指示符 二.typeid运算符 三.使用decltype指示符 四.decltype和引用 五.decltype(auto) ...

  4. Unity Shader入门精要学习笔记 - 第14章 非真实感渲染

    Unity Shader入门精要学习笔记 - 第14章 非真实感渲染 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1 ...

  5. 小米11android auto,小米MIUI 11这几个隐藏功能,每个都很发烧,知道的才是真米粉...

    原标题:小米MIUI 11这几个隐藏功能,每个都很发烧,知道的才是真米粉 MIUI 11系统,被雷军称为"小米历届MIUI系统中最优秀的系统",可见小米官方对MIUI 11非常的自 ...

  6. C++11 新增关键字decltype学习

    decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type"的缩写,译为&q ...

  7. C++11 类型推导decltype

    我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通 ...

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

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

  9. win 7 系统ie浏览器升级11版本后,f12功能不可用的问题

    自从把ie8升级成11后,f12功能就不可用了.浏览器兼容模式也无法使用. 解决办法:下载windows补丁 IE11-Windows6.1-KB3008923-x64.msu 下载地址: 64位:h ...

最新文章

  1. matlab软件介绍_活动回顾 | 您要的MATLAB课堂总结上线啦!
  2. eBay的Elasticsearch性能调优实践
  3. Lucene教程--维护索引、查询对象和相关度排序
  4. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - D. 质数
  5. 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容
  6. oracle 怎么 制造崩溃,oracle数据库崩溃
  7. java多线程基础概念
  8. 职场中晋升最快的人具有什么特点?
  9. 固定日历 jeDate 日期控件 选择时间,没有相应的回调事件
  10. 巴比特观察 | NFT朋克热潮:CryptoPunks的成功可以复制吗
  11. ad软件画pcb方法总结_PCB各层介绍及AD软件画PCB时的规则
  12. 8、大话设计模式--单例模式 、桥接模式、命令模式、职责链模式、中介者模式
  13. 计划排产软件助力厨房电器业提升管理
  14. 流星蝴蝶剑5.18公测(转自官方)
  15. 海尔智家半年报营收净利双增,卡萨帝、三翼鸟贡献几何?
  16. 一个转来的简单T9输入法
  17. 【黄啊码】vue-pdf预览时无法显示印章和中文字体或者乱码(简单粗暴)
  18. 影响百度竞价点击量的7大原因
  19. DirectX11 With Windows SDK--15 几何着色器初探
  20. 小云站:小程序定制开发让店家看到了最简单的赢利方位

热门文章

  1. 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资
  2. Horizon 队列管理工具常用命令
  3. 软考信息系统监理师:2016年4月8日作业
  4. python发送信息给文件传输助手
  5. 原生小程序实现折线图wx-charts(比echars体积小很多)
  6. 苹果 macOS Big Sur 11.5.1(20G80)正式版发布
  7. Scriptable Build Pipeline - 2018.2 入门指南
  8. 你知道这个提高 Java 单元测试效率的 IDEA 插件吗
  9. IDEA自带接口测试工具(http client)
  10. 最新仿山楂岛留言源码+轻量级简约