c++中decltype_find的用法归纳

c++中decltype_find的用法归纳1.什么是decltypedecltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用。autovarName=value;decltype(exp)varName=value;auto根据=右边的初始值推导出变量的类型,decltype根据exp表达式推导出变量的类型,跟=右边的value没有关系…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.什么是decltype     

        decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用。

auto varName=value;
decltype(exp) varName=value;
  •  auto根据=右边的初始值推导出变量的类型,decltype根据exp表达式推导出变量的类型,跟=右边的value没有关系
  • auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导
  • 而decltype不要求,因此可以写成如下形式
decltype(exp) varName;

原则上将,exp只是一个普通的表达式,它可以是任意复杂的形式,但必须保证exp的结果是有类型的,不能是void;如exp为一个返回值为void的函数时,exp的结果也是void类型,此时会导致编译错误

1.1decltype的几种形式

int x = 0;
decltype(x) y = 1;           // y -> int
decltype(x + y) z = 0;       // z -> int
const int& i = x;
decltype(i) j = y;           // j -> const int &
const decltype(z) * p = &z;  // *p  -> const int, p  -> const int *
decltype(z) * pi = &z;       // *pi -> int      , pi -> int *
decltype(pi)* pp = π      // *pp -> int *    , pp -> int * *

2.推导规则

     decltype的推导规则可以简单概述如下:

  • 如果exp是一个不被括号()包围的表达式,或者是一个类成员访问表达式,或者是一个单独的变量,decltype(exp)的类型和exp一致
  • 如果exp是函数调用,则decltype(exp)的类型就和函数返回值的类型一致
  • 如果exp是一个左值,或被括号()包围,decltype(exp)的类型就是exp的引用,假设exp的类型为T,则decltype(exp)的类型为T&

规则1示例:

#include<string> 
#include<iostream>
using namespace std;

class A{
public:
    static int total;
    string name;
    int age;
    float scores;
}

int A::total=0;

int main()
{
int n=0;
const int &r=n;
A a;
decltype(n) x=n;    //n为Int,x被推导为Int
decltype(r) y=n;    //r为const int &,y被推导为const int &
decltype(A::total)  z=0;  ///total是类A的一个int 类型的成员变量,z被推导为int
decltype(A.name) url="www.baidu.com";//url为stringleix
return 0;
}

规则2示例:

int& func1(int ,char);//返回值为int&
int&& func2(void);//返回值为int&&
int func3(double);//返回值为int

const int& func4(int,int,int);//返回值为const int&
const int&& func5(void);//返回值为const int&&

int n=50;
decltype(func1(100,'A')) a=n;//a的类型为int&
decltype(func2()) b=0;//b的类型为int&&
decltype(func3(10.5)) c=0;//c的类型为int

decltype(func4(1,2,3)) x=n;//x的类型为const int&
decltype(func5()) y=0;//y的类型为const int&&

exp中调用函数时需要带上括号和参数,但这仅仅是形式,并不会真的去执行函数代码

规则3示例:

class A{
public:
   int x;
}

int main()
{
const A obj;
decltype(obj.x) a=0;//a的类型为int
decltype((obj.x)) b=a;//b的类型为int&

int n=0,m=0;
decltype(m+n) c=0;//n+m得到一个右值,c的类型为int
decltype(n=n+m) d=c;//n=n+m得到一个左值,d的类型为int &
return 0;
}

左值:表达式执行结束后依然存在的数据,即持久性数据;右值是指那些在表达式执行结束不再存在的数据,即临时性数据。一个区分的简单方法是:对表达式取地址,如果编译器不报错就是左值,否则为右值

3.实际应用

     类的静态成员可以使用auto, 对于类的非静态成员无法使用auto,如果想推导类的非静态成员的类型,只能使用decltype。

示例如下:

template<typename T>
class A
{
private :
   decltype(T.begin()) m_it;
   //typename T::iterator m_it;   //这种用法会出错
public:
void func(T& container)
{
   m_it=container.begin();
}
};

int main()
{

const vector<int> v;
A<const vector<int>> obj;
obj.func(v);
return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195617.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Spring Boot第七章-Spring Boot Web配置-Tomcat配置

    Spring Boot第七章-Spring Boot Web配置-Tomcat配置

    2021年5月16日
    135
  • fasterrcnn详解_faster RCNN

    fasterrcnn详解_faster RCNNpaper:FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks前言fasterrcnn是何凯明等大神在2015年提出目标检测算法,该算法在2015年的ILSVRV和COCO竞赛中获得多项第一。该算法在fastrcnn基础上提出了RPN候选框生成算法,使得目标检测速度大大提高。RCN…

    2022年10月5日
    0
  • 什么是泛型以及在集合中泛型的使用[通俗易懂]

    什么是泛型以及在集合中泛型的使用[通俗易懂]什么是泛型?泛型最常与集合使用,因为泛型最开始开始被加入Java就是为了解决集合向下转型一类问题的。如果我们有这样一个需求:定义一个描述类圆,要求圆中的数据类型是不确定的,也就是声名属性的时候,属性类型是不确定的。比如描述类圆中有半径,要求半径可以用int,也可以用double。那么此时数据类型不确定,就使用泛型,把数据类型参数化。集合中泛型的使用List中使用泛型在我们创建集合时使用<>来声明List集合只能保存Dog类对象Listdogs=newArrayList<&gt

    2022年6月22日
    26
  • JAVA 二分法

    JAVA 二分法JAVA 二分法

    2022年4月23日
    42
  • 妥妥的世界第一:为什么MT4软件的地位无法撼动?

    妥妥的世界第一:为什么MT4软件的地位无法撼动?我是漆学军,2004年接触MT3.83的时候,还没有太在意,直到2005年,MT4正式推出之后,我就再也没有真正爱上别的软件,即便是MT4的升级版本MT5,我也一直提不起太大兴趣。外汇市场上有很多不同类型的交易软件,包括占领了大部分外汇交易市场的MT4、MT5、cTrader和各个机构自行研发的交易软件等等,然而,尽管竞争者很多,已经发布十六年了的MT4平台却依旧称得上是“交易软件之王”,市场占有率稳居世界第一,在外汇市场上具备不可动摇的地位。MT4平台简介MetaTrader4(MT4)..

    2022年5月29日
    109
  • html5教程单摆,Flash动画—单摆的制作教程

    html5教程单摆,Flash动画—单摆的制作教程想起当初作这个动画时,真是不知如何下手,所以,这是一篇献给初学者的教程的单摆动画的制作,应该要解决两个方面的问题:一、单摆本身的制作,这一点只要用好flash的绘图工具即可二、单摆振动,这一点将是教程的重点也是难点下面就先解决第一个问题,制作单摆(这一步的制作注意注册点的选择)首先要弄清,单摆有三部分组成:摆线、摆球、悬挂点(天花板)(一)、摆线:1、选取工具区的线条工具,线条粗细默认,在主场景按…

    2022年4月30日
    139

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号