博客
关于我
Effective Modern C++:02auto
阅读量:787 次
发布时间:2023-01-24

本文共 1588 字,大约阅读时间需要 5 分钟。

优先使用 auto,而非显式类型声明

在 C++ 编程中,显式地声明变量的类型虽然直观,但也存在一系列问题。我们将探讨使用 auto 的优势,以及如何让 auto 的推导行为更安全、更高效。

显式类型声明的缺点

显式类型声明如下:

int x; // 未初始化或初始化为 0,视语境而定template
void dwim(It b, It e) { while (b != e) { typename std::iterator_traits
::value_type currValue = *b; … }}

缺点包括:

  • 隐式括号问题:如果要使用 auto 声明变量,必须初始化。
  • 关闭类型的限定:闭包的类型只有编译器知道,且无法直接指定。
  • 内存管理复杂:与闭包相关的变量可能占用更多内存且运行缓慢。

auto 的解决方案

使用 auto 后,许多问题得到解决:

auto x3 = 0; // 正确初始化void dwim(It b, It e) {    while (b != e) {        auto currValue = *b; // 正确推导类型        …    }}

闭包变量的优化:

auto derefUPLess = [](const std::unique_ptr/widget>& p1, const std::unique_ptr(widget>& p2) {    return *p1 < *p2;};

auto 的优势:

  • 必须初始化:声明变量时必须赋值。
  • 正确管理闭包类型:类型与闭包一致,内存占用刚好。
  • 更高效:直接调用闭包而无间接函数调用。

局部变量类型检测

确保变量的类型在编译时可靠:

std::vector
v;unsigned sz = v.size();// 可能导致问题:`size_type` 在 32 位系统中为 32 bitsauto sz = v.size(); // 正确

std::unordered_map 的使用问题:

for (const auto& p : m) {    // 正确处理}

使用 auto 能直接取元素地址:

for (const auto& p : m) {    // 正确引用元素地址}

auto 与显式类型初始化

在某些情况下,auto 可能导致非预期类型推导:

bool highPriority = features(w)[5]; // 正确

如果改为:

auto highPriority = features(w)[5]; // 错误!

features(w)[5] 返回 std::vector<bool>::reference,在强制转换为 boolhighPriority 为正确类型:

auto highPriority = static_cast
(features(w)[5]); // 正确!

提示:对 std::vector<bool>operator[] 返回的对象为隐式代理类,避免直接演示 auto 推导到代理类型。

显式类型初始化原则

在必要时,使用 auto 并强制类型转换:

auto highPriority = static_cast
(features(w)[5]); // 正确!

总结

auto 作为现代 C++ 的强大工具,能够简化代码并提高效率。请谨慎使用 auto,并在非预期类型推导时,进行显式类型转换,以确保代码的安全性与可靠性。

转载于:https://www.cnblogs.com/gqtcgq/p/9733453.html

你可能感兴趣的文章
8位二进制转bcd算法 c语言,二进制转BCD码快速算法 bin to bcd fast code.
查看>>
900行c语言贪吃蛇,原生js实现的贪吃蛇网页版游戏完整实例
查看>>
ado filter 多条记录_Excel 有了Filter函数VLOOKUP函数要靠边站了
查看>>
ado读取多条oracle数据,Oracle ADO数据存取
查看>>
anaconda新建python2环境安装不了jupyterlab_anaconda3安装及jupyter环境配置教程(全)...
查看>>
android asynctask handler 区别,AsyncTask与Thread+Handler简要分析
查看>>
android fastjson漏洞_初识Fastjson漏洞(环境搭建及漏洞复现)
查看>>
android pod 组件化_CocoaPods 组件化实践 - 私有Pod
查看>>
$CH0201$ 费解的开关
查看>>
android进程管理策略,Android进程保活
查看>>
arduino蓝牙通讯代码_arduino 联接蓝牙模块
查看>>
asp.mvc 4项目发布文件目录结构_如何用SpringBoot(2.3.3版本)快速搭建一个项目?文末有小彩蛋...
查看>>
aspen串联反应怎么输入_如何进步提升串联谐振试验装置的稳定性
查看>>
aspose html转pdf_Java实现Word/Pdf/TXT转html
查看>>
a推b等价于非a或b_AB胶/蜜月胶常见问题的原因分析及解决方法
查看>>
bat 命令返回结果_【批处理】带你入门命令行
查看>>
c++ string取子串_Integer与String的设计哲学
查看>>
c++ 数组批量赋值_数组之间不能赋值?穿个马甲吧!
查看>>
cad模糊查询符号_mysql 正则模式和like模糊查询
查看>>
continue可以用if判断里面吗_谁能说说if()else()里的continue是干嘛的?
查看>>