想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用decltype
语法是:delctype(表达式),其中表达式可以是变量、函数、数组等。

#include <typeinfo>
#include <iostream>namespace test_decltype {double onlyDeclartionFunc();auto main() -> int {std::cout << "testing decltype..." << std::endl;/* 表达式是函数 */decltype(onlyDeclartionFunc()) sum = 34;   // 使用decltype根据函数类型推断类型时可以仅要求函数有声明,不要求函数有定义std::cout << "type(sum) is: " << typeid(sum).name() << std::endl;  // double/***************************************************************************/float i = 3.4f;decltype(i) a = 52;std::cout << "type(a) is: " << typeid(a).name() << std::endl;     // float// 使用decltype时会返回变量的真实类型(包括const和引用),这与auto有区别const int ci = 0;        // const intconst int &cj = ci;      // const int &decltype(ci) b = 9;      // const int// b = 10;   // error C3892: “b”: 不能给常量赋值decltype(cj) c = b;      // const int &// c = ci;   // error C3892: “c”: 不能给常量赋值decltype(cj) d = 9;     // const int &// decltype(cj) e;  // error C2530: “e”: 必须初始化引用std::cout << "type(ci) is: " << typeid(ci).name() << std::endl;  // const int(ps:编译器输出时不会带const,下同)std::cout << "type(cj) is: " << typeid(cj).name() << std::endl;  // const int &std::cout << "type(b) is: " << typeid(b).name() << std::endl;    // const intstd::cout << "type(c) is: " << typeid(c).name() << std::endl;    // const int &std::cout << "type(d) is: " << typeid(d).name() << std::endl;    // const int &/***************************************************************************/// decltype(表达式)推断出引用类型的几种情况:// 1. 表达式本身是引用;// 2. 表达式是指针的解引用;// 3. 表达式加括号;int j = 0;int &k = j;int *p = &j;std::cout << "Original j, 0 == " << j << std::endl;decltype(k) f = k;     // f是j的引用(表达式本身是引用)f = 1;std::cout << "f is j's reference, 1 == " << j << std::endl;decltype(*p) g = j;    // g是j的引用(表达式是指针的解引用)g = 2;std::cout << "g is j's reference, 2 == " << j << std::endl;decltype((j)) h = j;   // h是j的引用(表达式加括号)h = 3;std::cout << "h is j's reference, 3 == " << j << std::endl;decltype(k+0) m = k;   // m是int,不是int&,因为k+0是int类型m = 4;std::cout << "m is not j's reference, 4 != " << j << std::endl;// 对数组使用decltype**得到的是数组类型int arr[] = {3,4,5};// decltype(arr) crr = {5,6,7,8,9};    //  error: too many initializers for 'int [3]'decltype(arr) drr = {5,6,7};           // 注意,数组元素的个数是数组类型的一部分std::cout << "type(drr) is: " << typeid(drr).name() << std::endl;   // int [3]/***************************************************************************/std::cout << "------------------------------" << std::endl;return 0;}
}

以上程序的输出:

testing decltype...
type(sum) is: double
type(a) is: float
type(ci) is: int
type(cj) is: int
type(b) is: int
type(c) is: int
type(d) is: int
Original j, 0 == 0
f is j's reference, 1 == 1
g is j's reference, 2 == 2
h is j's reference, 3 == 3
m is not j's reference, 4 != 3
type(drr) is: int [3]

对数组使用decltype得到的是数组类型,与auto不同

// 对数组使用decltype
int arr[] = {3,4,5};// decltype(arr) crr = {5,6,7,8,9};    //  error: too many initializers for 'int [3]'
decltype(arr) drr = {5,6,7};           // 注意,数组元素的个数是数组类型的一部分
std::cout << "type(drr) is: " << typeid(drr).name() << std::endl;   // int [3]

decltype用法介绍相关推荐

  1. awk 和sed的用法介绍

    awk 和sed的用法介绍 一.awk的介绍 1. 作用及用法要求 2. 使用方法 (1)使用的命令: (2)举例说明: 二.sed的介绍 1. 用法介绍及常用命令 2. 具体使用 一.awk的介绍 ...

  2. Scanpy(一)AnnData数据结构与一些API用法介绍

    目录 Scanpy简介与安装 AnnData AnnData的结构 h5ad:AnnData的写入和读取 Scanpy中一些常用api的用法介绍 sc.pp.filter_cells sc.pp.fi ...

  3. php中使用mysql的视图_MYSQL中视图的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于MYSQL中视图的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.什么是视图 执行一条SQL,将结果集保存在一张虚拟表中 (相关 ...

  4. pm2常用的命令用法介绍

    pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,下面我们来看pm2常用的命令用法介绍吧 ...

  5. predicate java_java8中predicate的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于java8中predicate的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 传递代码 我们首先看一个例子,假设你有一个 Appl ...

  6. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  7. CompletableFuture API用法介绍(二)

    文章目录 一.纯消费 API 1.thenAccep 2.thenAcceptBoth 3.runAfterBoth 4.thenRun(Runnable action) 二.组合API 1.then ...

  8. python数组用sum求和_对python中array.sum(axis=?)的用法介绍

    根据代码中运行的结果来看,主要由以下几种: 1. sum():将array中每个元素相加的结果 2. axis对应的是维度的相加. 比如: 1.axis=0时,对饮搞得是第一个维度元素的相加, [[0 ...

  9. php simpledateformat,Java中SimpleDateFormat的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于Java中SimpleDateFormat的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.为什么要使用SimpleDateFo ...

最新文章

  1. 性能测试工具Lmbench的使用和下载
  2. 【生成模型】极大似然估计,你必须掌握的概率模型
  3. java filereader blob_如何从javascript发送音频blob到java spring服务...
  4. android软件获取系统签名
  5. 1组第一次作业-小组自我介绍
  6. AtCoder 杂题训练
  7. OpenDigg前端开源项目周报1219
  8. Mysql 如何设置字段自动获取当前时间
  9. 美国航天能力断层严重
  10. RDKit|使用MolDraw2DCairo模块绘制分子
  11. jQuery获取表单数据
  12. PyQt5 QThread应用
  13. 智慧园区系统设计方案
  14. 修复谷歌浏览器翻译插件无法使用的问题
  15. 100ask imx6ull开发板移植NXP官方UBOOT
  16. QA | R做生存分析如何取最佳cutoff(截断)
  17. java lint_Android静态代码检查-Lint
  18. 华硕Eee PC 设置U盘启动
  19. android培训学习班,常州android培训学习班
  20. 多项式回归(PolynomialFeatures)

热门文章

  1. 【软件工程】内聚和耦合
  2. DM数据库使用DMRMAN备份与还原(二)
  3. 如何从一个美术变成程序员?
  4. sizeof计算二维数组长度的问题
  5. JS 二维数组的定义及长度判断
  6. 通俗理解TCP/IP协议三次握手与四次分手流程
  7. Hbuilder用自有证书打包 ios App上架AppStore流程
  8. 国泰君安国际:华能新能源维持买入
  9. 人工智能在医疗领域的不同层次
  10. extern用法总结