博客
关于我
Effective Modern C++:02auto
阅读量:788 次
发布时间: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

你可能感兴趣的文章
efficientnet最合适的尺寸和最后一层的层数
查看>>
EF三种编程方式详细图文教程(C#+EF)之Database First
查看>>
Ehcache Java开源缓存框架
查看>>
EhCache 分布式缓存/缓存集群
查看>>
EHR:对人力资源信息系统的认识
查看>>
EJB学习笔记六(EJB中的拦截器)
查看>>
el-form表单重置后输入失效
查看>>
el-select下拉框修改背景色
查看>>
el-table select事件判断当前项是否勾选
查看>>
Elasticsearch & Kibana & Filebeat开启SSL通信
查看>>
ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案
查看>>
ElasticSearch - 分布式搜索引擎底层实现——倒排索引
查看>>
ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点)
查看>>
ElasticSearch - 基于 docker 部署 es、kibana,配置中文分词器、扩展词词典、停用词词典
查看>>
ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合
查看>>
ElasticSearch - 基于 JavaRestClient 操作索引库和文档
查看>>
ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)
查看>>
ElasticSearch - 基于 “黑马旅游” 案例,实现搜索框、分页、条件过滤、附近酒店、广告置顶功能
查看>>
20241012更新_yum install 找不到合适的yum源_yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067
查看>>
ElasticSearch - 基础概念,以及和 mysql 的对比
查看>>