首页 > 其他分享 >auto与decltype

auto与decltype

时间:2023-07-24 15:46:01浏览次数:36  
标签:ci decltype int auto 引用 const

  在C++中,有时候我们不知道某个变量x应该定为何种数据类型,但是我们知道他和另一个变量/函数有关系,这种情况下,可以通过auto或者decltype来初始化这个变量,让编译器自行判断其类型。

auto

  首先看下面的代码,这里通过auto初始化x=0和*p=x,编译器很聪明地读懂了我的意思,把x定为int类型,p定义为int的指针。

#include <iostream>
#include<typeinfo>
using namespace std;
int main()
{
    auto x=0,*p=&x;
    cout<<typeid(x).name()<<endl;
    cout<<typeid(p).name()<<endl;
    return 0;
}
i
Pi

  有时候,编译器可能并不能读懂你的意思,例如引用,使用引用其实是使用引用的对象,这时候如果使用auto,那么编译器会选择引用对象的类型作为auto的类型,下面例子中,r是对i的引用,但是在auto的时候,a是一个int型,而非引用类型,这是值得注意的。

  第二点需要注意的是,auto会忽略掉顶层const,保留底层const,顶层与底层const可以见另一篇文章关于const的用法 - para_dise - 博客园 (cnblogs.com)。在下面的例子中,ci是const int型,但是在初始化b的时候,auto会忽略这个顶层const,会初始化为int类型,如果需要保留顶层const特性,需要如f一般重新声明。

    int i=0,&r=i;
    auto a=r;        //a是一个整数
    const int ci=i,&cr=ci;        
    auto b=ci;                //b是一个整数
    auto c=cr;                //c是一个整数
    auto d=&i;                //d是一个整型指针
    auto e=&ci;                //e是一个指向整数常量的指针
    const auto f=ci;//ci的推演类型是int,f是const int
    auto &g=ci;                //g是一个整型常量引用,绑定到ci

 

decltype

   有时候,我们只想要他的类型,但是不想用他的值初始化,这时候可以用decltype实现。

  decltype可以继承const和引用,如下:

    decltype(f()) sum=x;    //sum的类型是函数f的返回类型
    const int ci=0,&cj=ci;
    decltype(ci) x=0;        //x是const int
    decltype(cj) y=x;        //y是const int& 并绑定到x上(引用必须初始化)
    

  想获得引用对象的类型,那么可以通过加0的办法,使其成为int类型,如果想要变成一个变量的引用,可以通过加括号的办法。

    int i=42,*p=&i,&r=i;
    
    decltype(r+0) b;    //加法的结果是int,因此b是一个未初始化的int
    decltype(*p) c=i;     //*p是解引用,因此得到的c是一个引用,这里将其绑定到a
    
    decltype((i)) d=i;    //变量名+括号,结果也是引用,绑定到i
    

  

 

  综上,auto与decltype各有各自的应用场景,最好结合实际使用。

标签:ci,decltype,int,auto,引用,const
From: https://www.cnblogs.com/lan-jing/p/17577277.html

相关文章

  • 如何在AutoCAD中加载数据库的空间数据?
    在AutoCAD中加载矢量数据是一个非常有用的功能,它可以帮助用户将多种不同格式的数据集合在一个平台上进行分析和编辑。按照以下步骤可快速在AutoCAD中加载数据库中的空间数据,支持SQLServer、MySQL、PostgreSQL。方法/步骤下载并安装GIS4CAD插件http://www.geosaas.com/downloa......
  • mysql auto_increment怎么删除
    MySQL中的auto_increment如何删除在MySQL中,auto_increment是一个非常有用的功能,它允许我们在插入数据时自动为表的主键字段生成唯一的递增值。然而,有时候我们可能需要删除表中的某些数据行,这就会导致auto_increment值出现断层。本文将介绍如何在MySQL中删除数据行时保持auto_incre......
  • Auto Encoder(自编码器)
    AutoEncoder(自编码器)SelfSupervisedLearning(自监督学习):用没有标注的资料训练模型,发明不需要标注资料上的任务,例如:做填空题、预测下一个token(符号);在BERT和GPT之前,有一种方法就是AutoEncoderAutoEncoder(自编码器):也是一种用没有标注的资料训练的模型AutoEncoder运作方式:......
  • Python3 pyautogui安装成功,但是不能引用
    安装使用的是pycharm,python3.8python-mpipinstallpyautogui-ihttps://pypi.tuna.tsinghua.edu.cn/simple,显示Successfully。 引用importpyautogui报错:Nomodulenamed'pyautogui'解决办法尝试各种网上的方法,查询环境等,不太懂,感觉没有问题偶然发现虽然piplist有......
  • spring boot使用mongodb时,xxxRepository不能Autowired的问题
    默认情况下,当继承MongoRepository的CRUD在@SpringBootApplication的子包下时,xxxRepository是能够自动被扫描和创建代理的。但是如果不在默认路径下,就无法注入了,即使是扫描路径加到了@ComponentScan也一样。解决方法:在springboot启动类中添加@EnableMongoRepositories注解,标注mon......
  • 用Power Automate获取SharePoint文件内容
    1.根据文件夹路径获取路径下所有文件内容使用SharePoint连接器的“获取文件(仅属性)”操作,站点地址选SharePoint的默认站点,库名选择对应文档库,我这里把SharePoint集成到Dynamics365的实体附件,库名就是对应的实体名。仅限文件夹条目为 /entityname/relativeurl,entityname为实体名,r......
  • C# 程序中使用AutoMapper实体映射
     我的开发环境framework为4.7.2添加AutoMapper9.0引用创建实体映射公共类publicclassAutoMapperUnity{publicstaticIMapperautoMapperTool;publicAutoMapperUnity(){autoMapperTool=AutoMapperUnit......
  • Python与UIAutomator测试
    1.APP测试UI测试:导航测试,图形测试,内容测试功能测试性能测试:响应能力测试(安装卸载功能性操作),压力测试(反复/长期)兼容性测试安全测试:发送信息拨打电话链接网络访问手机信息联系人信息设置权限;执行某些操作时导致的输入有效性验证授权数据加密;将网络协议的测试,防止恶......
  • CentOS报错/bin/sh: autoconf: command not found
     目录一、问题描述二、解决方法1.查看autoconf、automake是否已安装2.查看autoconf、automake对应的包3.安装 一、问题描述CentOS7下执行makeconfigure命令时报错:/bin/sh:autoconf:commandnotfound 二、解决方法1.查看autoconf、automak......
  • Proj. CMI Paper Reading: Conversational Automated Program Repair
    Abstract背景:之前APR与大模型的结合仅仅使用了一些特殊构建的input/prompt本文:conversationalAPR方法:使用long-termcontextwindow来记录之前的validationfeedback实验:在10个LLMs上进行对比展示改进......