热门标签 | 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绑定在了一起


推荐阅读
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • Adversarial Personalized Ranking for Recommendation
    目录概主要内容基础对抗扰动对抗训练细节代码HeX.,HeZ.,DuX.andChuaT.Adversarialpersonalizedrankingforrecommendatio ... [详细]
  • 本文详细探讨了PHP中使用const和define定义常量的方法及其差异。了解这些区别有助于开发者根据具体需求选择合适的方式定义常量。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 深入理解iOS中的链式编程:以Masonry为例
    本文通过介绍Masonry这一轻量级布局框架,探讨链式编程在iOS开发中的应用。Masonry不仅简化了Auto Layout的使用,还提高了代码的可读性和维护性。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
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社区 版权所有