auto与decltype

news/2024/11/30 9:31:48/

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.ppmy.cn/news/1551156.html

相关文章

IvorySQL与pg_failover_slot插件:如何实现逻辑复制槽的高可用主备同步

前言 在数据库高可用架构中&#xff0c;逻辑复制是实现数据同步和扩展的重要机制之一。通过逻辑复制&#xff0c;数据库管理员可以选择性地复制特定表的数据&#xff0c;而不必像物理复制那样进行全量数据库实例的复制。然而&#xff0c;逻辑复制槽的局限性在于它仅存在于主节…

QT的exec函数

在Qt框架中&#xff0c;exec()方法是QDialog类&#xff08;及其子类&#xff09;的一个成员函数&#xff0c;用于以模态&#xff08;modal&#xff09;方式显示对话框。当exec()被调用时&#xff0c;它会启动一个局部的事件循环&#xff0c;这个循环会阻塞对对话框之外的其他窗…

实时数据开发 | Flink反压机制原因、影响及解决方案

今天是很忙碌的一天哦&#xff0c;有两个业务在催着验收&#xff0c;终于21&#xff1a;45卡点交上去了。 明早再修修补补一下应该就可以开始做实时方面的需求了&#xff0c;小紧张&#xff0c; 今天同事在同步会上讲这块业务的数据流时就提到了checkpoint和savepoint还有流处理…

深入讲解Spring Boot和Spring Cloud,外加图书管理系统实战!

很抱歉&#xff0c;我的疏忽&#xff0c;说了这么久还没有给大家详细讲解过Spring Boot和Spring Cloud,那今天给大家详细讲解一下。 大家可以和下面这三篇博客一起看&#xff1a; 1、Spring Boot 和 Spring Cloud 微服务开发实践详解https://blog.csdn.net/speaking_me/artic…

Vite 6 正式发布

11 月 26 日&#xff0c;Vite 6.0 正式发布。自一年前 Vite 5 发布以来&#xff0c;Vite 的采用率持续增长&#xff0c;每周 npm 下载量已从 750 万次跃升至 1700 万次。与此同时&#xff0c;Vitest 不仅越来越受到用户的青睐&#xff0c;并开始逐步建立起属于自己的生态系统。…

MySQL隐式转换造成索引失效

一、什么是 MySQL 的隐式转换&#xff1f; MySQL 在执行查询语句时&#xff0c;有时候会自动帮我们进行数据类型的转换&#xff0c;这个过程就是隐式转换。比如说&#xff0c;我们在一个 INT 类型的字段上进行查询&#xff0c;但是传入的查询条件却是字符串类型的值&#xff0c…

pageoffice最新版本浏览器点击没反应解决办法

一、问题现象 最新版本的谷歌、火狐浏览器&#xff0c;调用pageoffice时&#xff0c;点击后没反应&#xff08;旧的谷歌浏览器不受影响&#xff09;。 二、产生原因 服务器返回pageOffice的客户端唤起链接格式为&#xff1a; PageOffice://|http://192.168.1.120:8080/xxx …

2023年MathorCup高校数学建模挑战赛—大数据竞赛A题基于计算机视觉的坑洼道路检测和识别求解全过程文档及程序

2023年MathorCup高校数学建模挑战赛—大数据竞赛 A题 基于计算机视觉的坑洼道路检测和识别 原题再现&#xff1a; 坑洼道路检测和识别是一种计算机视觉任务&#xff0c;旨在通过数字图像(通常是地表坑洼图像)识别出存在坑洼的道路。这对于地质勘探、航天科学和自然灾害等领域…