decltype用法介绍

decltype用法介绍想从表达式推断出要定义的变量的类型 但不想计算表达式的值 此时可以使用 decltype

想从表达式推断出要定义的变量的类型,但不想计算表达式的值,此时可以使用decltype
语法是:delctype(表达式),其中表达式可以是变量、函数、数组等。

#include  
     #include  
     namespace test_decltype { 
    double onlyDeclartionFunc(); auto main() -> int { 
    std::cout << "testing decltype..." << std::endl; /* 表达式是函数 */ decltype(onlyDeclartionFunc()) sum = 34; // 使用decltype根据函数类型推断类型时可以仅要求函数有声明,不要求函数有定义 std::cout << "type(sum) is: " << typeid(sum).name() << std::endl; // double /*/ float i = 3.4f; decltype(i) a = 52; std::cout << "type(a) is: " << typeid(a).name() << std::endl; // float // 使用decltype时会返回变量的真实类型(包括const和引用),这与auto有区别 const int ci = 0; // const int const int &cj = ci; // const int & decltype(ci) b = 9; // const int // b = 10; // error C3892: “b”: 不能给常量赋值 decltype(cj) c = b; // const int & // c = ci; // error C3892: “c”: 不能给常量赋值 decltype(cj) d = 9; // const int & // decltype(cj) e; // error C2530: “e”: 必须初始化引用 std::cout << "type(ci) is: " << typeid(ci).name() << std::endl; // const int(ps:编译器输出时不会带const,下同) std::cout << "type(cj) is: " << typeid(cj).name() << std::endl; // const int & std::cout << "type(b) is: " << typeid(b).name() << std::endl; // const int std::cout << "type(c) is: " << typeid(c).name() << std::endl; // const int & std::cout << "type(d) is: " << typeid(d).name() << std::endl; // const int & /*/ // decltype(表达式)推断出引用类型的几种情况: // 1. 表达式本身是引用; // 2. 表达式是指针的解引用; // 3. 表达式加括号; int j = 0; int &k = j; int *p = &j; std::cout << "Original j, 0 == " << j << std::endl; decltype(k) f = k; // f是j的引用(表达式本身是引用) f = 1; std::cout << "f is j's reference, 1 == " << j << std::endl; decltype(*p) g = j; // g是j的引用(表达式是指针的解引用) g = 2; std::cout << "g is j's reference, 2 == " << j << std::endl; decltype((j)) h = j; // h是j的引用(表达式加括号) h = 3; std::cout << "h is j's reference, 3 == " << j << std::endl; decltype(k+0) m = k; // m是int,不是int&,因为k+0是int类型 m = 4; std::cout << "m is not j's reference, 4 != " << j << std::endl; // 对数组使用decltype得到的是数组类型 int arr[] = { 
   3,4,5}; // decltype(arr) crr = {5,6,7,8,9}; // error: too many initializers for 'int [3]' decltype(arr) drr = { 
   5,6,7}; // 注意,数组元素的个数是数组类型的一部分 std::cout << "type(drr) is: " << typeid(drr).name() << std::endl; // int [3] /*/ std::cout << "------------------------------" << std::endl; return 0; } } 

以上程序的输出:

testing decltype... type(sum) is: double type(a) is: float type(ci) is: int type(cj) is: int type(b) is: int type(c) is: int type(d) is: int Original j, 0 == 0 f is j's reference, 1 == 1 g is j's reference, 2 == 2 h is j's reference, 3 == 3 m is not j's reference, 4 != 3 type(drr) is: int [3] 

对数组使用decltype得到的是数组类型,与auto不同

// 对数组使用decltype int arr[] = { 
   3,4,5}; // decltype(arr) crr = {5,6,7,8,9}; // error: too many initializers for 'int [3]' decltype(arr) drr = { 
   5,6,7}; // 注意,数组元素的个数是数组类型的一部分 std::cout << "type(drr) is: " << typeid(drr).name() << std::endl; // int [3] 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210393.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:41
下一篇 2026年3月19日 上午7:41


相关推荐

  • pycharm如何执行高级撤销操作回到历史[通俗易懂]

    pycharm如何执行高级撤销操作回到历史[通俗易懂]今天写代码兴奋过头了,认为别人写得太麻烦,所以在看了这个人是要达成什么样的目标之后,把他的代码直接删了,然后自己重写,到后来发现有这样那样的问题,这个时候想参考原来的代码,可是为时已晚,已经是6,7个小时之前了,姑且不问能否一直使用低级撤销ctrl+z,就算可以,估计也要半个小时才能回到6,7个小时之前吧。这个时候,我悲从中来,悔恨自己在最开始的时候没有弄一个备份。但是,痛定思痛,发现了这一个撤销的高级操作,回退到历史,我以前在使用AndroidStudio的时候也有这个功能,所以试了试pycharm

    2022年8月26日
    8
  • LSTM简介以及数学推导(FULL BPTT)

    LSTM简介以及数学推导(FULL BPTT)前段时间看了一些关于LSTM方面的论文,一直准备记录一下学习过程的,因为其他事儿,一直拖到了现在,记忆又快模糊了。现在赶紧补上,本文的组织安排是这样的:先介绍rnn的BPTT所存在的问题,然后介绍最初的LSTM结构,在介绍加了遗忘控制门的,然后是加了peepholeconnections结构的LSTM,都是按照真实提出的时间顺序来写的。本文相当于把各个论文核心部分简要汇集一下而做的笔记,已提供快

    2022年6月23日
    25
  • idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用

    idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用最近公司的很多同事开始使用IntelliJIdea,便尝试了一下,虽然快捷键与eclipse有些不同,但是强大的搜索功能与“漂亮的界面”(个人认为没有eclipse好看),还是值得我们去使用的。刚开始使用的idea要去集成svn,下载公司的项目。我是用的是TortoiseSVN(小乌龟),下载后安装,然后记住安装路径,我安装的是64位的。TortoiseSVN的下载地址:htt…

    2022年10月17日
    7
  • 数据集网站_drone无人机模拟训练软件

    数据集网站_drone无人机模拟训练软件中国人不骗中国人。csdn李居然有人卖几十块智商税。其实只要外网一查就免费。看我来砸他生意。免费万岁!共享永存!GitHub-dasmehdix/drone-dataset:Dronedatasettoguideenemydrones(withsometools)…

    2022年8月15日
    5
  • Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略[通俗易懂]

    Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略[通俗易懂]Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略目录关于OpenCV简介OpenCV应用领域1、计算机视觉领域方向2、计算机操作底层技术安装OpenCV的的两种方法T1、使用whl文件法T2、直接命令法T3、Anaconda环境下安装OpenCV常见函数、方法0、基本库函数1、图像基本运算2、Image.open和cv2.imread的区别及其转换相关文章:Py

    2022年6月23日
    40
  • mysql性能分析工具_中大型suv横向测评

    mysql性能分析工具_中大型suv横向测评因为工作的原因,我有机会仔细用过市面上几乎所有的MySQL管理工具,对各家的数据库管理软件的特性有了全面的了解。我大概用了20+款MySQL管理工具,从种挑出10款最棒的写了今天的测评。其中7款免费或有社区免费版,另外3种是付费版。当初,在研究这些工具时,我发现网上那些所谓的测评推荐文章里,几乎没人真用过自己文章中写的软件,都是云测评。当时就想自己把所有软件都用一遍,找机会写一篇深度横向测评文章,帮助选择困难症患者,选到最合适大家当下工作场景的工具,节省时间。本文所写软件.

    2022年8月22日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号