decltype推导规则

devtools/2024/10/22 4:53:39/

decltype推导规则

当用decltype(e)来获取类型时,编译器将依序判断以下四规则:

1.如果e是一个没有带括号的标记符表达式(id-expression)或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型。此外,如果e是一个被重载的函数,则会导致编译时错误。
2.否则,假设e的类型是T,如果e是一个将亡值(xvalue),那么decltype(e)为T&&。
3.否则,假设e的类型是T,如果e是一个左值,则decltype(e)为T&。
4.否则,假设e的类型是T,则decltype(e)为T。

标记表达式:基本上,所有出去关键字、字面量等编译器需要使用的标记之外的程序员自定义的标记(token)都可以是标记符(identifier)。而单个标记符对应的表达式就是标记符表达式。比如:int arr[4];
则arr是一个标记符表达式,而arr[3]+0、arr[2]等,则都不是标记符表达式。
通过代码理解:

int arr[5] = {0};
int* ptr = arr;
struct S {double d;} s;
void Overload(int);
void Overload(char);	//重载函数
int&& RvalRef();
const bool Func(int);
int i = 0;//规则1:单个标记符表达式以及访问类成员,推导为本类型
decltype(arr) var1; // int[5],标记符表达式
decltype(ptr) var2; // int*,标记符表达式
decltype(s.d) var3; // double,成员访问表达式
decltype(Overload) var4; // 重载函数无法通过编译//规则2:将亡值推导为类型的右值引用
decltype(RvalRef()) var5 = 1; //int&&//规则3:左值推导为类型的引用
decltype(true ? i : i) var6 = i; //int&,三元运算符,返回一个i的左值
decltype((i)) var7 = i; //int&,带圆括号的左值
decltype(++i) var8 = i; //int&,++i返回i,i是左值
decltype(arr[3]) var9 = i; //int&, []操作符返回左值
decltype(*ptr) var10 = i; //int&,*解引用操作符返回左值
decltype("lval") var11 = "abc"; //const char(&)[] 类型是字符型常量数组的引用,字符串字面常量为左值//规则4:以上都不是,推导为本类型
decltype(1) var12; //int,除字符串外的字面量为纯右值
decltype(i++) var13; //int,后置自增符返回的是i的临时复制变量,是纯右值
decltype((Func(i))); //const int,括号可以忽略

在这里插入图片描述


http://www.ppmy.cn/devtools/122159.html

相关文章

计算机毕业设计 助农产品采购平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

滚雪球学Oracle[4.2讲]:PL/SQL基础语法

全文目录: 前言一、PL/SQL基础语法1.1 变量声明变量声明示例: 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表(嵌套表)嵌套表的定义与使用 3.2 关联数组关联数组…

P3792 由乃与大母神原型和偶像崇拜

原题链接 不愧是 lxl,硬控我一个半小时。最终也是极限卡过了。 这道题题解区有许多用哈希思想做的,可能实现方式略有不同。而我还是喜欢写保证了正确性的做法。具体说,就是用线段树维护区间最大最小值,因为是一段连续的数&#…

Async-Validator——表单验证的艺术

在现代 web 应用开发中,表单验证是一个不可或缺的部分。它确保了用户输入的数据符合预期的格式和规则,从而提高了数据的质量和用户体验。async-validator 是一个强大的 JavaScript 库,它专门用于异步表单验证,被广泛应用于主流 UI…

java中有两个list列表,尽量少的去循环

java中有两个list列表,一个list列表是paymentRecord,另外一个list是listApplyBase,paymentRecord中的lendCode字段值跟listApplyBase中的repaymentCode字段值是对应的,用stream流去循环paymentRecord列表,然后判断当pa…

Oracle bbed编译安装及配置

1. 什么是bbed ? Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看,编辑修改的内置工具。对于bbed,oracle本身是不提供支持的。 2. 如何编译bbed环境? 10g版本: 1) 编译bbed cd $ORACL…

基于imdb数据集的情感分析个人的所有博客汇总

1. IMDB 数据集下载 Imdb影评的数据集介绍与下载_imdb已整理数据集-CSDN博客 2. RNN 或 LSTM 模型 [深度学习]-基于tensorflow的CNN和RNN-LSTM文本情感分析对比-CSDN博客 [深度学习TF2][RNN-LSTM]文本情感分析包含(数据预处理-训练-预测)_lstm预测模…

CMake所学

向大佬lyf学习,先把其8服务器中所授fine 文章目录 前言一、CMakeList.txt 命令1.1 最外层CMakeLists1.1.1 cmake_minimum_required()1.1.2 project()1.1.3 set()1.1.4 add_subdirectory&#xf…