热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++auto和decltype的用法总结

一,auto1,auto的作用一般来说,在把一个表达式或者函数的返回值赋给一个对象的时候,我们必须要知道这个表达式的返回类型,但是有的时候我们很难或者无法知道这个表达式或者函数的

一, auto

1, auto的作用

    一般来说, 在把一个表达式或者函数的返回值赋给一个对象的时候, 我们必须要知道这个表达式的返回类型, 但是有的时候我们很难或者无法知道这个表达式或者函数的返回类型. 这个时候, 我们就可以使用auto关键字来让编译器帮助我们分析表达式或者函数所属的类型. 比如:

1

2

auto item = val1 + val2;

auto red = LayerColor::create(Color4B(255, 100, 100, 255), 200, 100);

    如果val1和val2都是int类型, 那么item也是int类型, 如果val1和val2是double类型, 那么item就是double类型. 而create()的返回值类型有可能会很复杂, 我们可以不用管, 这就使我们编程更加方便简单

 

2, auto和const

    auto会忽略掉顶层const, 保留底层const.  举例:

1

2

3

const int i = 5;

auto a = i;        // 变量i是顶层const, 会被忽略, 所以b的类型是int

auto b = &i;    // 变量i是一个常量, 对常量取地址是一种底层const, 所以b的类型是const int *

    因此, 如果希望推断出的类型是顶层const的, 那么就需要在auto前面加上cosnt:

1

const auto c = i;

 

3, auto和引用

① 如果表达式是引用类型, 那么auto的类型是这个引用的对象的类型.

1

2

int i = 2, &ri = i;

auto k = ri;            // k是int类型, 而不是引用类型

② 如果要声明一个引用, 就必须要加上&, 如果要声明为一个指针, 既可以加上*也可以不加*

1

2

3

4

int i = 3;

auto &refi = i;        // refi是一个int类型的引用

auto *p1 = &i;       // 此时推断出来的类型是int, p1是指向int的指针

auto p2 = &i;        // 此时推断出来的类型是int*, p2是指向int的指针

 

二, decltype

1, decltype的作用

    decltype只是为了推断出表达式的类型而不用这个表达式的值来初始化对象.

1

2

3

decltype(func()) sum = x; // sum的类型是函数func()的返回值的类型, 但是这时不会实际调用函数func()

int i = 0;

decltype(i) j = 4; // i的类型是int, 所以j的类型也是int

 

2, decltype和const

    不论是顶层const还是底层const, decltype都会保留   

1

2

const int i = 3;

decltype(i) j = i; // j的类型和i是一样的, 都是const int

 

3, decltype和引用

① 如果表达式是引用类型, 那么decltype的类型也是引用

1

2

const int i = 3, &j = i;

decltype(j) k = 5; // k的类型是 const int &

② 如果表达式是引用类型, 但是想要得到这个引用所指向的类型, 需要修改表达式:

1

2

int i = 3, &r = i;

decltype(r + 0) t = 5; // 此时是int类型

③ 对指针的解引用操作返回的是引用类型

1

2

int i = 3, j = 6, *p = &i;

decltype(*p) c = j; // c是int类型的引用, c和j绑定在一起

④ 如果一个表达式的类型不是引用, 但是我们需要推断出引用, 那么可以加上一对括号, 就变成了引用类型了

1

2

int i = 3;

decltype((i)) j = i; // 此时j的类型是int类型的引用, j和i绑定在了一起


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
author-avatar
好咯午睡了_740
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有