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++ auto关键字浅析 -> 正文阅读

[数据结构与算法]C++ auto关键字浅析

auto 关键字是从c++11标准引入的,实际用起来还是非常爽的!


优点:

  • 自动推导变量类型

  • 可以更加突出强制转换的用意

缺点:

  • 当发生非预期的隐式转换时,可能会出现无法预知的错误

分析:

众所周知,用迭代器去访问容器打起来挺麻烦的,总是要写一长段:

vector<int> vct;
for(vector<int>::iterator it = vct.begin(); it != vct.end(); it++){...}

而使用auto关键字就能少打很多字:

vector<int> vct;
for(auto it = vct.begin(); it != vct.end(); it++){...}

又或者当我们使用类型转换时,使用显示强转强制 auto 推导出想要的类型,更能表达出代码类型转换的用意:(《Effective Modern C++》中的例子)

// 返回double类型的计算函数
double calc();

// 假设在某处float精度已经足够用时,显然可以将计算结果转成float来储存
float output = calc(); 
// 或者
float output = (float)calc();

上述这种写法难以表明“我故意降低了函数的返回值精度”,但是这么却可以做到:

auto output = static_cast<float>(calc());

关于缺点,假设有一个函数接受一个 Widget 并返回 一个 std::vector<bool> ,其中每一个 bool 元素都代表着 Widget 是否提供一种特定功能:

vector<bool> features(const Widget& w);
Widget w;
bool highPriority = features(w)[5]; // 第5个元素表示 w 的优先级
processWidget(w, highPriority); // 根据优先级处理 w

若是对 highPriority 用 auto 来推导其类型时,代码依旧可以编译,但是行为则变得不可预期了:

auto highPriority = features(w)[5];
processWidget(w, highPriority); // 未定义行为!

为何会出现未定义行为?难道这里的 highPriority 不是 bool 类型吗?答案确实如此,从概念上来说,std::vector<bool> 中的元素应该就是 bool 型的,但 std::vector<bool> 的 operator[ ] 的返回值不是容器中的元素引用(其他类型都会返回对应元素的引用,但bool是个例外!),它返回的是 std::vector<bool>::reference 型的对象,至于为什么这里不做解释。
当用 bool highPriority 去接收 std::vector 的返回值时,底层会做一个隐式转换,从 std::vector::reference 到 bool 。
而使用 auto ,则会自动推导成 std::vector::reference ,这种非预期内的隐式转换就是导致出现未定义行为的罪魁祸首!!!


最后附上《Effective Modern C++》中的要点:

  • “隐形”的代理型别可以导致 auto 根据初始化表达式推导出“错误的”型别。
  • 带显示型别的初始化物习惯用法强制 auto 推导出你想要的型别。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:43:30  更:2022-03-16 22:50:06 
 
开发: 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/26 12:00:01-

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