首页 > 编程语言 >c++之auto关键字的注意点(涉及decltype)

c++之auto关键字的注意点(涉及decltype)

时间:2024-10-05 17:46:11浏览次数:7  
标签:decltype int auto c++ 引用 类型 const

1.基本规则

  • auto 会根据初始化表达式的类型推导出变量的类型。
  • 如果初始化的是值类型,auto 推导出的也是值类型。
  • 如果初始化的是引用类型,auto 会忽略引用类型,并推导出被引用对象的类型。
  • 如果初始化表达式是常量 (const),且 auto 不是引用类型,推导出的类型会去掉 const 限定符。volatile同理。

常见例子:

int x = 0;
const auto& r1 = x; // r1 是对 x 的常量引用,类型是 const int&
auto r2 = r1;       // r2 是什么类型?

推导过程:

  1. r1 是一个对 x 的常量引用(const int&),它引用了一个 int 类型的对象 x
  2. auto 作用于 r2 时,类型推导的规则是,auto 会忽略引用类型,而只根据被引用的对象的类型来推导。

因此:

  • r1 的类型是 const int&,但 r2 并不是引用,而是值类型。
  • 由于 r1 引用了一个 const int 类型,auto 会推导出 r2 的类型为 int,而不是 const int&

结论:

r2 的类型是 int,它是对 r1 所引用值的拷贝,而不再是引用。

//数组
int arr[] = {1, 2, 3};
auto x = arr;  // x 的类型是 int*,数组退化为指针

//指针
int x = 42;
int* ptr = &x;
auto y = ptr;  // y 的类型是 int*

//Lambda
auto lambda = [](int x) { return x + 1; };//在 Lambda 表达式中,auto 常用于类型不明确的变量推导。

//使用引用符号   保留const与初始化表达式的引用特性
const int x = 42;
auto y = x;  // y 是 int, const 被去掉
auto& z = x;  // z 是 const int&, 保留 const 限定符

 

2.auto 与 decltype

C++14 引入了 decltype(auto),可以保留表达式(expression)的所有类型信息(包括引用和 const 限定符)

//auto 与decltype的结合
int x = 42;
const int& ref = x;
decltype(auto) y = ref; // y 的类型与 ref 保持一致,即 const int&

template<typename T, typename U>
auto add(T t,U u)->decltype(t+u)
{ return t + u; }

decltype的几个特殊例子:

//expression是函数,则返回值为函数返回值的类型;
float* func(){};
decltype(func) b4;                      //b4是float*类型


//expression是是带括号的变量,则返回值为引用类型;
int i= 0;
decltype(i) d1;                         //d1是int类型
decltype((i)) d2;                       //错误! d2是int&类
型,必须初始化
decltype((i)) d3 = d1;                  //正确! d3是int&类型

//数组
int a[] = {1,2,3};
auto a1(a);                //a1是int*,指向a[0]
decltype(a) a3 = {0,1,2};    // decltype(a)返回类型是含有三个整形元素的数组,只能是三个,decltype(a) a3 = {0,1,2,3};会报错

//解引用 返回引用
int i= 5, *p = &i, &r = i;
decltype(r + 0) b1;                     //b1是整型,表达式结果是整型
decltype(*p) b2;                        //错误! 解引用操作,得到的是int&类型,未初始化
decltype(&p) b3;                        //取址操作,b3是int**类型

 

标签:decltype,int,auto,c++,引用,类型,const
From: https://www.cnblogs.com/W-cats/p/18448154

相关文章

  • Windows应急响应-Auto病毒
    目录应急背景分析样本开启监控感染病毒查看监控分析病毒行为autorun.inf分析2.异常连接3.进程排查4.启动项排查查杀1.先删掉autorun.inf文件2.使用xuetr杀掉进程3.启动项删除重启排查入侵排查正常流程应急背景运维人员准备通过windows共享文档方式为公司员工下发软件安装,开启完......
  • 欧拉筛解释(含C++代码)
    intprime[MAXN];//质数列表boolisPrime[MAXN];//标记是否为质数(0表示是,1表示不是)intcnt;//prime表长/*对于任意合数m,可写作m=p*k(p为m的最小质因子,k为m/p,m、k>1且为整数,k>p(p为最小质因子,k为其它几个质因子相乘,每个质因子都比p大,所以k>p))*///欧拉筛(使每个合数......
  • C++ 命名空间
    概念在C++中,命名空间(namespace)是一种将代码中的标识符(如变量名、函数名、类名等)进行分组和隔离的机制。它可以避免不同代码模块之间的命名冲突,提高代码的可维护性和可移植性。命名空间的定义基本语法为:namespace命名空间名称{//在这里定义变量、函数、类等}例......
  • C++-练习-52
    题目:这个练习让您编写处理数组和结构的函数,下面是程序的框架,请提供其中描述的函数,以完成该程序#include<iostream>usingnamespacestd;constintSLEN=30;structstudent{charfullname[SLEN];charhobby[SLEN];intooplevel;}; intgetinfo(studentpa[],i......
  • vs code如何配置C/C++环境,实现完美运行.c/.cpp文件,以及终端乱码问题
    环境配置在VisualStudioCode(VSCode)中安装了C/C++ExtensionPack后,你可以通过以下步骤来运行C++文件:安装编译器配置编译任务:在VSCode中,你可以创建一个编译任务来编译你的C++文件。这通常通过创建一个tasks.json文件来完成。你可以通过以下步骤创建这个......
  • 南沙C++信奥赛陈老师解一本通题: 1828:【02NOIP提高组】均分纸牌
    ​ 【题目描述】有n堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为nn的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为n−1的堆上;其他堆上取的纸牌,可以移到相......
  • 1.1第一个C++程序
    1.启动Dev-C++        启动界面如图所示:2.新建源代码        单击文件[F]——新建[N]——源代码[S]3.输入代码        在右侧编辑区输入以下代码#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"HelloWorld!"<<endl;......
  • 【C++】 string类的模拟实现
    目录string类各函数接口总览构造函数拷贝构造函数赋值运行符重载函数析构函数迭代器相关函数beginend容量和大小相关的函数sizecapacityresizereserveempty修改字符串相关函数push_backappendoperator+=inserteraseclearswapc_str访问字符串相关函数o......
  • QT5 C++槽函数的两种connect连接方式的区别,建议使用现代的连接方式
    QT5C++槽函数的两种connect连接方式的区别,建议使用现代的连接方式(1)QT5C++槽函数定义classMainWindow:publicQMainWindow{Q_OBJECT//......privateslots:voidslotSplitterMoved(int,int);//......}(2)使用旧的字符串connect连接方式,容易报错或者警告 连......
  • 南沙C++信奥赛陈老师解一本通题 1270:【例9.14】混合背包
    ​ 【题目描述】一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总......