C++11特性之decltype

2023-05-16

检查一个实体的声明类型或者检查表达式类型和值类别。

语法

decltype ( entity )(1)(since C++11)

decltype ( expression )(2)(since C++11)

解释

(1)如果参数是未带括号的id表达式或未带括号类成员访问表达式,则decltype将生成由该表达式命名的实体的类型。如果没有这样的实体,或者如果参数命名了一组重载函数,则程序格式不正确。

如果参数是命名结构化绑定的没有括号id表达式,则decltype将生成引用的类型(在结构化绑定声明的规范中描述)。(从C++17开始)

如果参数是命名非类型模板参数的没有括号id表达式,则decltype将生成模板参数的类型(如果模板参数是用占位符类型声明的,则在执行任何必要的类型推导之后)。即使实体是模板参数对象(它是常量对象),类型也是非常量的。(从C++20开始)

(2) 如果实参是其他类型为 T 的任何表达式,并且:
        a) 如果表达式的值类别是亡值,将会 decltype 产生 T&&;
        b) 如果表达式的值类别是左值,将会 decltype 产生 T&;
        c) 如果表达式的值类别是纯右值,将会 decltype 产生 T。

如果表达式是返回类类型纯右值的函数调用,或是右操作数为这种函数调用的逗号表达式,那么不会对该纯右值引入临时量。(C++17 前)

如果表达式是除了(可带括号的)立即调用以外的 (C++20 起)纯右值,那么不会从该纯右值实质化临时对象:即这种纯右值没有结果对象。(C++17 起)

该类型不需要是完整类型或拥有可用的析构函数,而且类型可以是抽象的。此规则不适用于其子表达式:decltype(f(g())) 中,g() 必须有完整类型,但 f() 不必。

注意如果对象的名字带有括号,那么它会被当做通常的左值表达式,从而 decltype(x) 和 decltype((x)) 通常是不同的类型。

在难以或不可能以标准写法进行声明的类型时,decltype 很有用,例如 lambda 相关类型或依赖于模板形参的类型。

示例

#include <iostream>
#include <type_traits>
 
struct A { double x; };
const A* a;

// 要注意
decltype(a->x) y;       // y 的类型是 double(其声明类型)
decltype((a->x)) z = y; // z 的类型是 const double&(左值表达式)
 
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) // 返回类型依赖于模板形参
{                                     // C++14 开始可以推导返回类型
    return t+u;
}
 
int main() 
{
    int i = 33;
    decltype(i) j = i * 2;
 
    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
 
    std::cout << "i 和 j 的类型相同吗?"
              << (std::is_same_v<decltype(i), decltype(j)> ? "相同" : "不同") << '\n';


    auto f = [](int a, int b) -> int
    {
        return a * b;
    };
 
    decltype(f) g = f; // lambda 的类型是独有且无名的
    i = f(2, 2);
    j = g(3, 3);
 
    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
}

学习:decltype specifier - cppreference.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11特性之decltype 的相关文章

  • DirectXShaderCompiler mac编译

    Directxshader compiler mac编译 1 前置条件 Please make sure you have the following resources before building GitPython Version
  • intel -tbb 源码cmake构建

    cmake minimum required VERSION 3 0 0 FATAL ERROR set CMAKE CXX STANDARD 17 project tbb CXX add library tbb SHARED void c
  • 如何修改数据库密码

    多可文档管理系统是自带数据库的 xff0c 就是你在安装多可文档管理系统的同时 xff0c 数据库就已经自动安装上了 这个数据库有个默认密码 xff0c 为了数据库里的数据安全 xff0c 建议你安装完多可后 xff0c 就立刻修改数据库的
  • iOS编译openmp

    1 下载openmp源码 https github com llvm llvm project releases download llvmorg 14 0 6 openmp 14 0 6 src tar xz 2 下载ios toolch
  • 我的2013-从GIS学生到GIS职业人的飞跃

    我的 2013 从 GIS 学生GIS 职业人的飞跃 前言 xff1a 从末日中度过了 2012 年 xff0c 我们伟大的人类把这个世界末日的谎言给揭穿了 xff0c 但是不知不觉中 xff0c 2013 年又即将悄悄从我们身边溜走 xf
  • 矩阵的特征值和特征向量的雅克比算法C/C++实现

    矩阵的特征值和特征向量是线性代数以及矩阵论中非常重要的一个概念 在遥感领域也是经常用到 xff0c 比如多光谱以及高光谱图像的主成分分析要求解波段间协方差矩阵或者相关系数矩阵的特征值和特征向量 根据普通线性代数中的概念 xff0c 特征值和
  • windows多线程详解

    在一个牛人的博客上看到了这篇文章 xff0c 所以就转过来了 xff0c 地址是http blog csdn net morewindows article details 7421759 本文将带领你与多线程作第一次亲密接触 xff0c
  • tiff文件读取

    以下是VC下读取TIFF文件的代码 char szFileName 61 34 K 地图 fujian DEM fujian1 tif 34 TIFF tiff 61 TIFFOpen szFileName 34 r 34 打开Tiff文件
  • GIS开发人员需要掌握的知识和技能

    对于GIS行业 xff0c 可能很多人不是很了解 xff0c 对我来说也不是很了解 xff0c 在此呢 xff0c 我就我自己的看法发表一下简单的看法 xff0c 有什么不同的意见可以一起交流 GIS虽说是属于地理科学或者说测绘科学与技术的
  • GIS算法的一点理解

    在GIS这个专业也混了好几年了 xff0c 但是始终没有对GIS算法有过真正的研究 xff0c 可以说大部分不懂 目前关于GIS算法的书籍不是特别多 xff0c 数来数去也就那么几本 xff0c 南师大几个老师编写的地理信息系统算法基础 x
  • char*转LPCWSTR解决方案

    在Windows编程中 xff0c 经常会碰到字符串之间的转换 xff0c char 转LPCWSTR也是其中一个比较常见的转换 下面就列出几种比较常用的转换方法 1 通过MultiByteToWideChar函数转换 MultiByteT
  • 一阶互补滤波,二阶互补滤波,卡尔曼滤波

    一阶互补 a 61 tau tau 43 loop time newAngle 61 angle measured with atan2 using the accelerometer 加速度传感器输出值 newRate 61 angle
  • 项目实用makefile

    在上一篇文章 小项目实用makefile 中 xff0c 已经说明了单个makefile管理层次目录的局限性 本文 xff0c 主要总结一下项目中的一种实用makefile树写法 xff0c 为10来个人协作的中小型项目makefile编写
  • MPU6050工作原理及STM32控制MPU6050

    一 简介 1 要想知道MPU6050工作原理 xff0c 得先了解下面俩个传感器 xff1a 陀螺仪传感器 xff1a 陀螺仪的原理就是 xff0c 一个旋转物体的 旋转轴所指的方向在不受外力影响时 xff0c 是不会改变的 人们根据这个道
  • 自动驾驶(四十九)---------Kavser二次开发

    我们知道CAN总线是连接车身各个模块之间的桥梁 xff0c 通过协议通讯 xff0c 在车辆标定和测试中很多情况是用上位机和车身相连 xff0c 收发满足CAN总线的信号 这中间如何通讯呢 xff1f 这就需要用到Kavser Kvaser
  • Linux嵌入式设备时钟同步到硬件

    时间修改命令 date s 34 2022 06 27 11 51 02 34 同步到硬件 hwclock w 显示硬件时钟 hwclock r
  • linux opendir和readdir的使用

    1 opendir include lt sys types h gt include lt dirent h gt DIR opendir const char name 传入name路径 xff0c 成功则返回非空DIR指针 xff0c
  • 【Mybatis】No enum constant org.apache.ibatis.type.JdbcType.LONG

    问题描述 xff1a 今天编写定时任务管理模块 xff0c 提交定时任务实体信息时 xff0c 提示如下错误 nested exception is org apache ibatis builder BuilderException Er
  • ego-planner论文阅读笔记

    ESDF Euclidean Signed Distance Field EGO ESDF free Gradient based lOcal planning framework 摘要 通过比较碰撞轨迹与无碰撞引导路径 xff0c 得到惩
  • 冒泡排序,选择排序,插入排序的比较

    冒泡排序与选择排序相比 xff0c 一个从局部入手减少逆序元素 xff0c 一个放眼大局逐个选择最小值 xff0c 二者思路大不相同 但是 xff0c 它们又都有着 通过i次外层循环 xff0c 从数据中顺次求出i个最小值 的相同特征 相对

随机推荐

  • 【操作系统】2.3 进程同步与互斥

    这一节大概是操作系统中最难的一节了 2 3 1 进程的同步与互斥 2 3 1 进程的同步与互斥 StudyWinter的博客 CSDN博客 进程同步思维导图 进程同步 xff1a 在多道程序环境下 xff0c 进程是并发执行的 xff0c
  • 【算法】递增子序列

    总结一下三道求子序列长度的题 1 最长递增子序列 300 最长递增子序列 给你一个整数数组 nums xff0c 找到其中最长严格递增子序列的长度 子序列 是由数组派生而来的序列 xff0c 删除 xff08 或不删除 xff09 数组中的
  • 【算法】单调栈的题

    记一次笔试题 描述 给定一个长度为 nn 的可能含有重复值的数组 numsnums xff0c 找到每一个位置 ii 左边最近的位置 ll 和右边最近的位置 rr xff0c nums lnumsl 和 nums rnumsr 比 nums
  • Skip List--跳表(全网最详细的跳表文章没有之一)

    笔者目前是CPP方向 xff0c 今年 xff08 2023届 xff09 秋招时在简历中写的就是跳表的项目 xff0c 当时是啃源码啃下的 xff0c 把跳表整体的思路是理顺了 但是在面试过程中 xff0c 有不少面试官都对这个项目很感兴
  • 报错:Caused by: org.xml.sax.SAXParseException

    Caused by org xml sax SAXParseException 文档根元素 34 project 34 必须匹配 DOCTYPE 根 34 null 34 错误提示 xff1a gframework beans factor
  • 用malloc动态申请一个二维数组

    利用二级指针申请一个二维数组 define CRT SECURE NO WARNINGS include lt iostream gt include lt vector gt include lt algorithm gt using n
  • 有符号/无符号整数相加溢出的判断方法

    1 有符号数相加溢出判断 1 1 两个有符号的数是正数 当两个有符号整数x y同为正数 xff0c 且x 43 y的结果为非正时 xff0c 发生了正溢出 define CRT SECURE NO WARNINGS include lt i
  • 【算法】求最小子集的和被5整除

    昨天面试了一家公式 xff0c 面试上来问我 xff0c 使用过哪些STL容器 xff0c 我说了一下 xff0c 然后又问从最简单的开始说 面试官 xff1a 说说使用vector是需要注意什么 xff1f 我 xff1a 注意什么 迭代
  • TCP报文结构

    TCP报文结构 TCP报文由俩部分组成 xff1a TCP报头和TCP数据 TCP报文是TCP传输的数据单元 端口号 xff1a 用来标识一台主机的不同进程 1 xff09 源端端口号 xff1a 源端口和IP层解析出来的IP地址标识报文的
  • 【算法】洗牌算法

    碎碎念 xff1a 面试的时候 xff0c 让写这道题 xff0c 快写完了 xff0c 面试官告诉我 xff0c 这是洗牌算法 xff0c 1 介绍 洗牌算法是将原来的数组进行打散 xff0c 使原数组的某个数在打散后的数组中的每个位置上
  • 【操作系统】第一章总结

    1 1 操作系统介绍 1 1 1 操作系统的概念 功能和目标 1 1 1 操作系统的概念 功能和目标 xff08 系统资源的管理者 提供接口 作为扩充机器 虚拟机 xff09 StudyWinter的博客 CSDN博客 1 1 2 操作系统
  • 【操作系统】2.1 进程与线程总结

    2 1 1 操作系统之进程的定义 特征 组成 组织 2 1 1 操作系统之进程的定义 特征 组成 组织 StudyWinter的博客 CSDN博客 进程由程序段 数据段 进程控制块 xff08 PCB xff09 三部分组成 进程是进程实体
  • 【操作系统】2.2 操作系统的调度

    2 2 1 操作系统之处理机调度的概念及层次 2 2 1操作系统之处理机调度的概念及层次 StudyWinter的博客 CSDN博客 操作系统调度的层次 高级调度 xff08 作业调度 xff09 xff1a 外存 内存 中级调度 xff0
  • 【操作系统】2.4 死锁

    这一节也非常重要 2 4 1 死锁的概念 2 4 1 死锁的概念 StudyWinter的博客 CSDN博客 在并发环境下 xff0c 各种进程因竞争资源而造成的一种互相等待对方手里的资源 xff0c 导致各进程都阻塞 xff0c 都无法向
  • 3.1.1 什么是内存?进程的基本原理,深入指令理解其过程

    0 思维导图 1 什么是内存 xff1f 有何作用 xff1f xff08 1 xff09 存储单元 内存 Memory 是计算机的重要部件 xff0c 也称内存储器和主存储器 xff0c 它用于暂时存放CPU中的运算数据 xff0c 以及
  • 怎样用AT指令查询本机手机号码

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • 3.1.2 操作系统内存管理管些什么?

    0 思维导图 1 内存空间的分配与回收 2 内存空间的扩展 xff08 实现虚拟性 xff09 3 地址转换 4 内存保护 1 操作系统负责内存空间的分配和回收 xff1b 2 操作系统需要提供某种技术从逻辑上对内存空间进行扩充 xff1b
  • C++11特性

    最近打算照着源文档学习C 43 43 特性 xff0c 先从C 43 43 11的特性开始 学习 xff1a C 43 43 11 cppreference com C 43 43 11 C 43 43 11是继C 43 43 98之后的最
  • C++11特性之auto

    占位符类型说明 对变量而言 xff0c 指定要声明的变量的类型将从其初始值中自动推导出来 对于函数而言 xff0c 指定的返回类型将从其返回语句中推导出来 xff08 从C 43 43 14开始 xff09 对于非模版类型的参数而言 xff
  • C++11特性之decltype

    检查一个实体的声明类型或者检查表达式类型和值类别 语法 strong decltype strong entity strong strong 1 since C 43 43 11 strong decltype strong expres