当前位置: 首页 > news >正文

C++新标准——decltype 关键字

        decltype 是 C++11 新增的一个关键字,它和 auto 一样,都用来在编译期进行类型推导。它不需要对表达求职即可获得表达式类型。C++ 文档给出的介绍是:decltype 检查实体的声明类型表达式的类型和值类别。实际应用这些场景:标记符的类型推导函数模板的返回值类型推导 Lambda 表达式中 auto&& 类型的形参类型推导函数模板的函数参数的类型推导等。

一、语法

decltype(entity)

如果实参是未加括号的标识符表达式未加括号的类成员访问表达式,则

decltype 产生该表达式所命名实体的类型。若不存在此实体,或实参指代一组重载函数,则程序非良构(编译出错)。

C++17、C++20 暂略

decltype(expression)

若实参是其他类型为 T 的任何表达式,且

a> 若 expression 的值类别是将亡值,则 decltype 结果为 T&&;

b> 若 expression 的值类别是左值,    则 decltype 结果为 T&

c>  若 expression 的值类别是纯右值,则 decltype 结果为 T

C++17、C++20 暂略

上述表格对语法的表述可能略显晦涩,其实它们表达的核心是如下前两种情况:

  1. 表达式一个变量,则 decltype 返回变量的类型(包含顶层 const 和引用在内),如下代码片段传给 decltype 的实参都是变量(名):
    int main(int argc, char *argv[])
    {const int ci = 9, &cj = ci;decltype(ci) x = 0;decltype(cj) y = x;
    }
  2.  表达式不是一个变量(而是其他类型为 T 的任何表达式)则 decltype 返回表达式结果的类型。此时还需要考虑表达式的 value category:
    int main(int argc, char* argv[]) 
    {int j = 88, i = 9, k = 68, *p = &i, &r = i;decltype(r + 0) b = 66;decltype(*p) c = j;decltype(6) pv = 8;decltype(std::move(k)) xv;return 0;
    }

  3. 实参是加括号的标识符表达式,简单说“标识符表达式”就是定义变量名、函数名等。如果给变量加一层或多层括号,编译器就会把它当作表达式;变量可以作为赋值语句的左值,结合这两种特征,decltype 会返回相应的引用类型
    int main(int argc, char* argv[]) 
    {int t = 99, s = 9;decltype((t)) ref = s;return 0;
    }

  4. 实参是函数调用时,decltype 会返回与函数调用时返回值一致的类型

    static int foo() { return 2; }static int&& xv_foo()
    {int i = 9;return std::move(i);
    }int main(int argc, char* argv[]) 
    {decltype(foo()) foo_v;decltype(xv_foo()) foo_xv = 999;
    }

    二、decltype 使用场景

http://www.dtcms.com/a/452886.html

相关文章:

  • Java中通过.xml文件管理测试用例类
  • 清空全网题目系列 · 洛谷 · P1054 [NOIP 2005 提高组] 等价表达式
  • 偏振光阴影投影的三元光学逻辑处理器
  • GitLab 安装指南
  • 磁共振成像原理(理论)20:K空间采样 (Sampling of k-Space) - 采样定理
  • 安装wslgui
  • 激光+摄像头:打造高精度视觉测量系统
  • ie的常用网站渭南市建设局网站
  • 前端混入与组合实战指南
  • C++ 学习(3) ----设计模式
  • 畜牧业网站模板怎么做自己的网站平台
  • DAY 43 复习日-2025.10.7
  • 大数据毕业设计选题推荐-基于大数据的人体生理指标管理数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Auricore亮相杭州RWA峰会,以黄金RWA重塑Web3新生态
  • 于飞网站开发免费推广软件工具
  • ChainVault闪耀杭州RWA峰会,黄金RWA重塑Web3新生态
  • [论文阅读] AI+软件工程(迁移)| 从JDK8到21:FreshBrew如何为AI代码迁移画上“可信句号”
  • 电信大数据实战:MySQL与Hadoop高效同步
  • 郑州经济技术开发区协同办公系统seo比较好的公司
  • FFmpeg开发笔记(十二):ffmpeg音频处理、采集麦克风音频录音为WAV
  • 金融大模型应用现状及未来趋势研究:国内外对比分析
  • AI 在金融、医疗、教育、制造业等领域都有广泛且深入的应用,以下是这些领域的一些落地案例
  • TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 变量(Variable)的定义与操作
  • AI行业应用:金融、医疗、教育、制造业领域的落地实践
  • 【Git 子模块冲突解析】
  • 软件设计师——09 数据库技术基础
  • Guava Cache 高性能本地缓存库详解与使用案例
  • 开源安全管理平台wazuh-阻止恶意IP访问
  • 蒲城做网站网站定制开发成本
  • 嵌入式开发入门:从 FreeRTOS 任务到通信协议(详细教程)