• decltype用于编译时类型推导,是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值。
  • decltype的用法:
     //推导出表达式类型
    int i = ;
    decltype(i) a;//首先推导变量i的类型为int,然后通过返回结果声明变量a,a的类型为int
  • 在C++中,我们有时候会遇上一些匿名类型,如:
  • struct{
    int d;
    double b;
    }anon_s;

    而借助decltype,我们可以重新使用这个匿名的结构体:

  • decltype(anon_s) as;//定义了一个上面匿名的结构体
  • decltype推导四规则:
    • 如果e是一个没有带括号的标记符表达式或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型(注意:如果e是一个被重载的函数,则会导致编译错误)
    • 否则,假设e的类型是T,如果e是一个将亡值,那么decltype(e)为T&&
    • 否则,假设e的类型为T,如果e是一个左值,那么decltype(e)为T&
    • 否则,假设e的类型为T,则decltype(e)为T
  • 举例说明:
  •  int i = ;
    int arr[] = {};
    int *ptr = arr;
    struct s
    {
    double d;
    }s;
    void Overloaded(int);
    void Overloaded(char);//函数重载
    int && RvalRef();
    const bool Func(int); //规则1,推导为其类型
    decltype (arr) var1;//没有括号的标记符表达式,为其实体类型int
    decltype(ptr) var2;//没有括号的标记符表达式,为其实体类型int *
    decltype(s.d) var3;//没有括号的类成员访问表达式,为其实体类型double
    decltype(Overloaded) var4;//重载函数,编译错误 //规则2,将亡值,推导为类型的右值引用
    decltype (RvalRef()) var5 = ; //规则3,左值,推导为类型的引用
    decltype ((i)) var6 = i; //int &
    decltype (true ? i:i) var7 =i;//int &
    decltype (++i) var8 =i; //int &
    decltype (arr[]) var9 =i;//int &
    decltype (*ptr) var10 = i;
    decltype ("hello") var11 = "hello";//const char(&) [9],字符串字面常量为左值,且为const左值 //规则4:以上都是不,则推导为本类型
    decltype () var12; //const int
    decltype (Func()) var = true;//const bool
    decltype(i++) var14 = i;//int i++返回右值
  • 注意:字符串字面值常量为左值,而且是const左值,而非字符串字面常量则是右值

decltype关键字的更多相关文章

  1. C++11的decltype关键字

    C++11的decltype关键字 概述 decltype关键字和auto有异曲同工之处 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了 ...

  2. C++11特性:decltype关键字

    decltype简介 我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应ty ...

  3. 【C++】C++11的auto和decltype关键字

    转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...

  4. C++11新标准:decltype关键字

    一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型 ...

  5. C++11常用特性介绍——decltype关键字

    一.decltype的意义 有时我们只想从表达式的类型推断出要定义的变量类型,但是不想用其值进行初始化的时候,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在 ...

  6. C++—lambda表达式+优先队列 prority_queue+关键字decltype

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[  1->4->5,  1->3->4,  2->6]输出: 1->1-&g ...

  7. C++11 auto and decltype

    1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:aut ...

  8. 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

    3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...

  9. C++ 11 学习1:类型自动推导 auto和decltype

    Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...

随机推荐

  1. 空中网4k/5k月薪挑选大四实习生的线程题

    空中网4k/5k月薪挑选大四实习生的线程题 两年前,我们一个大四的学员去应聘空中网的实习生职位,空中网只给他出了三道线程题,拿回家做两天后再去给经理讲解,如果前两题做好了给4k月薪,第三道题也做出来的 ...

  2. eshop4-tomcat 安装

    1. 下载tomcat 7 2. 解压缩 注意:是否使用sudo 权限执行请根据具体环境来决定 3. sudo vim /etc/profile 在最下方增加 export CATALINA_HOME ...

  3. Numpy中np.random.randn与np.random.rand的区别,及np.mgrid与np.ogrid的理解

    np.random.randn是基于标准正态分布产生的随机数,np.random.rand是基于均匀分布产生的随机数,其值在[0,1). np.mgrid 与np.ogrid的理解及区别:np.mgr ...

  4. Windows系统批处理命令实现计划关机

    操作步骤: 1.新建一个文本文件,粘贴下面代码,保存为shutdown.bat @echo off echo 请输入延迟关机分钟数 echo 小于1分钟将视为立即关机,负数为取消关机 set /p t ...

  5. 《ES6标准入门》(阮一峰)--4.字符串的扩展

    1.字符的 Unicode 表示法 ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点. "\u0061" ...

  6. 统计返回的Decimal/long型数据转换问题

    mysql数据库在进行统计时候,返回的count()是个long型,sum()返回的是bigDecimal类型,前段需要的是int型故而需要进行转换. <select id="getD ...

  7. 官网英文版学习——RabbitMQ学习笔记(六)Routing

    有选择的接收消息. 上一节我们使用的是fanout exchange来实现消息的发布/订阅模式,这并没有给我们带来多大的灵活性——它只能够让人盲目地进行广播.而本节我们采用direct类型的交换器来实 ...

  8. idea开发springboot 的mysql数据库连接问题

    今天在家用idea进行springboot开发,前面一些坑相对避免了,但是到数据库这块总是连接不上,报错主要是: Access denied for user 'root'@'localhost' ( ...

  9. WIN10打开资源管理器显示该文件没有与之关联的程序来执行该操作.请安装应用,请在“默认应用设置”..关联 —— 解决方案

    win+R,输入regedit,分别在HKEY_CLASSES_ROOT\piffileHKEY_CLASSES_ROOT\InternetShortcutHKEY_CLASSES_ROOT\lnkf ...

  10. SpringMVC原理及流程解析

    前言 春节期间宅在家里闲来无事,对SpringMVC进行了比较深入的了解,将之前模糊不清的地方基本摸索清楚了,特此撰文总结记录一下. 正文 一.一个请求为什么会调用到SpringMVC框架里? 首先问 ...