decltype用法介绍
想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用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用法介绍相关推荐
- awk 和sed的用法介绍
awk 和sed的用法介绍 一.awk的介绍 1. 作用及用法要求 2. 使用方法 (1)使用的命令: (2)举例说明: 二.sed的介绍 1. 用法介绍及常用命令 2. 具体使用 一.awk的介绍 ...
- Scanpy(一)AnnData数据结构与一些API用法介绍
目录 Scanpy简介与安装 AnnData AnnData的结构 h5ad:AnnData的写入和读取 Scanpy中一些常用api的用法介绍 sc.pp.filter_cells sc.pp.fi ...
- php中使用mysql的视图_MYSQL中视图的用法介绍(代码示例)
本篇文章给大家带来的内容是关于MYSQL中视图的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.什么是视图 执行一条SQL,将结果集保存在一张虚拟表中 (相关 ...
- pm2常用的命令用法介绍
pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,下面我们来看pm2常用的命令用法介绍吧 ...
- predicate java_java8中predicate的用法介绍(代码示例)
本篇文章给大家带来的内容是关于java8中predicate的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 传递代码 我们首先看一个例子,假设你有一个 Appl ...
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...
- CompletableFuture API用法介绍(二)
文章目录 一.纯消费 API 1.thenAccep 2.thenAcceptBoth 3.runAfterBoth 4.thenRun(Runnable action) 二.组合API 1.then ...
- python数组用sum求和_对python中array.sum(axis=?)的用法介绍
根据代码中运行的结果来看,主要由以下几种: 1. sum():将array中每个元素相加的结果 2. axis对应的是维度的相加. 比如: 1.axis=0时,对饮搞得是第一个维度元素的相加, [[0 ...
- php simpledateformat,Java中SimpleDateFormat的用法介绍(代码示例)
本篇文章给大家带来的内容是关于Java中SimpleDateFormat的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.为什么要使用SimpleDateFo ...
最新文章
- 性能测试工具Lmbench的使用和下载
- 【生成模型】极大似然估计,你必须掌握的概率模型
- java filereader blob_如何从javascript发送音频blob到java spring服务...
- android软件获取系统签名
- 1组第一次作业-小组自我介绍
- AtCoder 杂题训练
- OpenDigg前端开源项目周报1219
- Mysql 如何设置字段自动获取当前时间
- 美国航天能力断层严重
- RDKit|使用MolDraw2DCairo模块绘制分子
- jQuery获取表单数据
- PyQt5 QThread应用
- 智慧园区系统设计方案
- 修复谷歌浏览器翻译插件无法使用的问题
- 100ask imx6ull开发板移植NXP官方UBOOT
- QA | R做生存分析如何取最佳cutoff(截断)
- java lint_Android静态代码检查-Lint
- 华硕Eee PC 设置U盘启动
- android培训学习班,常州android培训学习班
- 多项式回归(PolynomialFeatures)