当前位置: 首页 > article >正文

auto与decltype

auto:

1.定义:

在C++中, auto 是一个类型说明符,它让编译器在编译阶段自动推导变量的类型,其类型取决于初始化表达式的类型。auto 在声明变量时使用,编译器会根据变量初始化表达式自动推断类型。

#include<iostream>
#include <typeinfo>
using namespace std;
int fun()
{
	return 1;
}
int main()
{
	int a = 1;
	auto b = a;
	auto c = 'a';
	auto d = fun();
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化
	return 0;
}
//typeid 是一种在运行时获取类型信息的方式,它可以用来实现类型安全的转换和其他依赖于类型识别的功能。
//是C++中的一个内置函数,返回一个const char*类型的指针,指向该类型信息的字符串表示。
//注意要包含#include <typeinfo>

2.注意事项:

1)必须初始化

2)不能和指针结合来修改数组:

auto* a 加一个 * 是在强调变量 a 是指针,故a只能接受指针类型,并不是将变量类型改为指针类型,没有指针auto类型。

3)在同句话中,auto的类型必须相同

4)auto& b 是在强调b是引用,但引用可以除了可以接收引用,还可以接收其它类型,故b除了可以接收引用外还可以接收其它类型(int, double……),说明b是该类型变量的引用。

decltype:

1.定义:

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

2.形式

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 = &pi;      // *pp -> int *    , pp -> int * *

3.与auto区别:

1)auto根据=右边的初始值推导出变量的类型,decltype根据exp表达式推导出变量的类型,跟=右边的value没有关系

2)auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导而decltype不要求

auto p=value;
decltype(exp) p=value;

decltype也可以写为:

decltype(exp) p;

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

4.应用:

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

template<typename T>
class A
{
private :
   decltype(T.begin()) m;
   //typename T::iterator m;   //这种用法会出错
public:
void func(T& hhh)
{
   m=hhh.begin();
}
};
 
int main()
{
 
const vector<int> vec;
A<const vector<int>> obj;
obj.func(vec);
return 0;
}


http://www.kler.cn/a/416700.html

相关文章:

  • 『 Linux 』数据链路层 - ARP协议及数据链路层周边问题
  • springboot学习-spring-boot-data-jdbc分页/排序/多表查询的例子
  • 【YOLOv10改进[Backbone]】使用MobileNetV2替换Backbone
  • Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。
  • 南京大学苏州校区学生代表团到访合合信息,开启“沉浸式”人工智能企业行
  • 云计算基础-期末复习
  • Python知识点精汇:列表篇精汇!
  • 泰州榉之乡全托机构探讨:自闭症孩子精细动作训练之法
  • C++设计模式(装饰模式)
  • Java中的运算符“instanceof“详解
  • pycharm链接neo4j数据库(简单)
  • 系统思考—结构影响行为
  • ubuntu24.04 python环境
  • jdk8没有InputStream.transferTo()
  • 鸿蒙千帆启新程,共绘数字生态蓝图
  • 腾讯阅文集团Android面试题及参考答案
  • 【查询目录】.NET开源 ORM 框架 SqlSugar 系列
  • 在VMware虚拟机上安装Kali Linux的详细教程(保姆级教程)
  • 腾讯微众银行大数据面试题(包含数据分析/挖掘方向)面试题及参考答案
  • 鸿蒙NEXT元服务:利用App Linking实现无缝跳转与二维码拉起
  • Linux系统编程——进程替换
  • Python异步编程新写法:asyncio模块的最新实践
  • K8s的API资源对象NetworkPolicy
  • BiGRU:双向门控循环单元在序列处理中的深度探索
  • SAP Native SQL 的简单说明
  • C#里怎么样LINQ来从数组里获得大于某数的值?