decltype关键字

  • decltype用于编译时类型推导,是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值。
  • decltype的用法:

    1 //推导出表达式类型
    2int i = 4;
    3decltype(i) a;//首先推导变量i的类型为int,然后通过返回结果声明变量a,a的类型为int
  • 在C++中,我们有时候会遇上一些匿名类型,如:
  • 1struct2{
    3int d;
    4double b;
    5}anon_s;

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

  • 1decltype(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
  • 举例说明:
  •  1 int i = 4;
     2 int arr[5] = {0};
     3 int *ptr = arr;
     4 struct s
     5 {
     6     double d;
     7 }s;
     8 void Overloaded(int);
     9 void Overloaded(char);//函数重载
    10 int && RvalRef();
    11 const bool Func(int);
    12
    13 //规则1,推导为其类型
    14 decltype (arr) var1;//没有括号的标记符表达式,为其实体类型int
    15 decltype(ptr) var2;//没有括号的标记符表达式,为其实体类型int *
    16 decltype(s.d) var3;//没有括号的类成员访问表达式,为其实体类型double
    17 decltype(Overloaded) var4;//重载函数,编译错误
    18
    19 //规则2,将亡值,推导为类型的右值引用
    20 decltype (RvalRef()) var5 = 1;
    21
    22 //规则3,左值,推导为类型的引用
    23 decltype ((i)) var6 = i; //int &
    24 decltype (true ? i:i) var7 =i;//int &
    25 decltype (++i) var8 =i; //int &
    26 decltype (arr[5]) var9 =i;//int &
    27 decltype (*ptr) var10 = i;
    28 decltype ("hello") var11 = "hello";//const char(&) [9],字符串字面常量为左值,且为const左值
    29
    30 //规则4:以上都是不,则推导为本类型
    31 decltype (1) var12; //const int
    32 decltype (Func(1)) var 13 = true;//const bool
    33 decltype(i++) var14 = i;//int i++返回右值
  • 注意:字符串字面值常量为左值,而且是const左值,而非字符串字面常量则是右值
时间: 2024-10-05 19:14:07

decltype关键字的相关文章

C++11 新特性之 decltype关键字

decltype关键字用于查询表达式的类型.与其他特性结合起来之后会有意想不到的效果. decltype的语法是 decltype (expression) 实例: #include <iostream> #include <typeinfo> using namespace std; int main() { int i; double d; float f; struct A { int i; double d; }; decltype(i) i1; cout <<

C++11的auto和decltype关键字

今天Mayuyu要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已经就有了auto关键字,只不过在C++98中auto表示的是临时变量的语义,而在C++11中auto表示自动类型推导,如下 auto关键字可以从表达式中推导出变量的类型,这样就大大简化了编程人员的工作.而且auto是在编译时对变量进行了类型推导,所以不会对程序的效率造成影响,另外auto也不会对编译速度造成太大影响,因为编译时本身也要右侧推导后判断是否与左侧匹配. 另外auto在模板编程中也

C++11特性:decltype关键字

转自:https://www.cnblogs.com/QG-whz/p/4952980.html decltype简介 我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通过name成员函数返回类型的名称.同时在C++11中typeid还提供了hash_code这个成员函数,用于返回类型的唯一哈希值.RTTI会导致运行时效率降低,且在泛型编程中,我们

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

一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值. 二.decltype用法 1.基本用法 int getSize(); int main(void) { int tempA = 2; /*1.dclTempA为int*/ declty

《Effective Modern C++》翻译--条款3: 理解decltype

条款3:理解decltype decltype 是一个非常有趣的怪兽.如果提供了一个名字或是表达式,decltype关键字将会告诉你这个名字或这个表达式的类型.通常情况下,结果与你的期望吻合.然而有些时候,decltype产生的结果领你挠头,使你去翻阅参考书或在网上问答中寻求答案. 我们先从通常的情况开始-这里没有暗藏惊喜.联系到在模板类型推导和auto类型推导中发生了什么,decltype关键字就像鹦鹉学舌一样,对于变量名称或表达式类型的推导跟模板类型推导和auto类型推导没有任何变化: co

c++11——auto,decltype类型推导

c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率.     auto和decltype的类型推导都是编译器在编译的时候完成的,auto是通过定义auto变量时候给出的表达式的值推导出实际类型,并且在声明auto变量时必须马上初始化:decltype通过表达式的值推导出实际的类型,但是可以只声明变量,而不赋值. auto类型推导 1. auto推导 auto x = 5; //被编译器推导为int类型 au

第2课 类型推导(2)_decltype关键字

1. decltype关键字 (1)auto所修饰的变量必须被初始化,编译器才能通过初始化来确定auto所代表的类型,即必须先定义变量. (2)decltype可以在编译期推导出一个变量或表达式的结果类型(但不会真正计算表达式的值),并且使用这个结果定义新的变量. [实例分析]获取表达式的类型 //2.1.cpp #include <iostream> using namespace std; int main() { int x = 0; decltype(x) y = 1; //y: in

C++11:类型推导和追踪函数返回类型decltype

参考文章:https://blogs.oracle.com/pcarlini/entry/c_11_tidbits_decltype_part decltype 是 GCC 实现的第一个 C++ 11 新特性.它实际上起源于一个相当古老的 GNU 扩展关键字-- __typeof__.这个非标准关键字也能够在 C 语言中使用,GNU Compiler Collection 的专业用户可能对它更熟悉一些.2008 年,GCC 4.3.x 就实现了这个特性,同时去除了 __typeof__ 的一些缺

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

你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11) 3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就是利用数组(一种数据组织管理方式,它将多个相同类型的数据元素组织起来,形成一个数据序列以便于访问.更多可以参考后文3.6小节对数组的介绍)来保存一个字符串中的各个字符,最后用一个特