IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++新特性-auto类型推导 -> 正文阅读

[C++知识库]c++新特性-auto类型推导

auto的类型推导相当于模板推导的进阶版,在大部分情况下,auto的推导规则与模板的推导规则是一样的。至于扩展部分等下在讲。注意:如果你还不懂模板的推导规则,请去看我的另一篇关于模板规则的文章。

现在我要先讲两件事,数组和函数类型的退化。

举例

int array[] = {1, 2, 3};

int* p = array;

现在我想问问你,array的类型是什么?

答案:int[3]。是你没看错,注意:不是int[]类型,也不是int[1],也不是int[2]。

那么,我的下一个问题就是,为什么一个int[3]类型能赋值给一个int*呢?这在c++的赋值中简直是不可思议的!

答案:int[3]类型退化为了int*类型,所以赋值成功了。

另一个例子

void func(int, double);

void* p = func;

现在我想问问func的类型是什么?

答案:void (int, double)。准确点说func的类型就是void func(int, double)。

那么,我的下一个问题是,为什么一个void*类型能被它赋值呢?它又不是指针。

答案:void (int, double) 退化为了 void* (int, double)。

!!!

现在,我试图向你证明这一点,并试图让你看懂。注意:这并不算在auto的扩展内容中,模板推导也适用。

举例:

int array[] = {1, 2, 3};

auto p1 = array;//p1的类型为int*,因为array退化了
auto& p2 = array;//我们惊奇的发现:p2的类型为int(&)[30]。



void func(int, double) {}

auto p1 = func;//p1的类型为void(*)(int, double),因为func退化了
auto& p2 = func;//p2的类型为void(&)(int, double)。这符合我们的预期

(*p1)(1, 2.0);//这很指针
p2(1, 2.0);//这相当于就是func()

!!!

接下来,我们看看auto类型推导相较于模板的类型推导,多出来的部分

在c++11中,我们可以这么赋值

int x = {27};
int x{27};

当我用auto进行推导上面的情况时,我们惊奇的发现auto居然不是int!

auto x1 = {20};//auto是std::intializer_list<int>
auto x2{10};//auto是std::intializer_list<int>

关于为什么会出现这种情况,我并不想解释太多,你只需要知道是因为{}其实是一个模板,显然它与std::intializer<T>有关。

需要注意的是{}内的类型要一直,不然会出错,因为{}不允许不一致。

当然auto也不是总能好的把{}推导出来,关于函数的时候,它就失效了

auto func(){
    return {1, 2, 3};
}//错误,推导不出来


auto p = []{ return {1, 2, 3}; };//错误,推导不出来。这是Lambda表达式,我以后会讲到。

这就是auto推导与模板推导不同的地方,其他地方,模板怎么推导,auto就怎么推导。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 11:41:26  更:2021-10-19 11:42:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:40:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码