当前位置:网站首页>decltype用法介绍
decltype用法介绍
2022-06-24 06:51:00 【GarryLau】
想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用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 int
const 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 int
std::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]
边栏推荐
- 交友相亲类软件是如何割你韭菜的
- Thread considerations
- 3-列表简介
- 某问答社区App x-zse-96签名分析
- Hongmeng development IV
- LeetCode 515 在每个数行中找最大值[BFS 二叉树] HERODING的LeetCode之路
- [test development] first knowledge of software testing
- Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its
- Common array encapsulation
- 第 3 篇:绘制三角形
猜你喜欢

First acquaintance with JUC - day01

第 2 篇:繪制一個窗口

Cold thinking on the hot track: multiplier effect is the fundamental requirement of East West calculation
![LeetCode 515 在每个数行中找最大值[BFS 二叉树] HERODING的LeetCode之路](/img/16/011ba3aef1315c39526daac7e3ec89.png)
LeetCode 515 在每个数行中找最大值[BFS 二叉树] HERODING的LeetCode之路

闲谈:3AC到底发生了什么?

Case examples of corpus data processing (cases related to sentence retrieval)

Practice of opengauss database on CentOS, configuration
![[C language] system date & time](/img/de/faf397732bfa4920a8ed68df5dbc48.png)
[C language] system date & time

SVN实测常用操作-记录操作大全

Oracle advanced SQL qualified query
随机推荐
Bit operation
希尔伯特-黄变换
.jar中没有主清单属性
LeetCode 515 在每个数行中找最大值[BFS 二叉树] HERODING的LeetCode之路
Mousse shares listed on Shenzhen Stock Exchange: gross profit margin continued to decline, and marketing failed in the first quarter of 2022
单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案
自动化测试的生命周期是什么?
常见的数组封装
BOM笔记
Detailed explanation of PHP data serialization test example
opencvsharp二值图像反色
【NILM】非入侵式负荷分解模块nilmtk安装教程
用Ngrok 配置属于自己的免费外网域名
SVN实测常用操作-记录操作大全
力扣(LeetCode)174. 地下城游戏(2022.06.23)
What is the lifecycle of automated testing?
Mysql database recovery case sharing
First acquaintance with JUC - day01
行内元素、块元素、行内块元素
Live wire, neutral wire and ground wire. Do you know the function of these three wires?