0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++ decltype和返回类型后置使用方法

冬至子 来源:iDoitnow 作者:艰默 2023-07-18 15:37 次阅读

1. decltype

decltype的使用方式如下:

decltype(expression) var;

关键字decltype的作用是将变量的类型声明为表达式指定的类型。即将var的类型声明为expression指定的类型。编译器在处理decltype的时候,实际上需要对expression进行一个核对,然后才能确定var的类型。其流程和核对规则大致如下:

  • 1)如果expression是一个没有用括号括起来的标识符,则var的类型与该标识符的类型相同 。例如:
double x = 1.0;
double y = 2.0;
double &lx = x; 
const double *pd;

decltype(x) m;      //m的类型为double
decltype(lx) n = y; //n的类型为double &
decltype(pd) u;     //u的类型为const double *
  • 2) :如果expression的条件不符合1), expression是一个函数的调用,则var的类型与函数的返回值类型相同。 例如:
int sum(int a, int b){...}

decltype(sum(1,2)) m; //m的类型为int
  • 3) :如果expression的条件不满足1)、2), expression是一个左值,则var指向该左值类型的引用。 例如:
double xx = 1.0;

decltype( (xx) ) rx = xx; //rx的类型是double &
decltype(xx) m = xx; //m的类型是double,因为虽然xx是左值,但该类型的确定在步骤1)就已经确认了,所以走不到步骤3)

:括号并不能改变表达式的值和左值性。】

  • 4)如果expression的条件不满足1)、2)、3),则expression的类型就是var的类型。 例如:
int a = 1;
int &b = a;
int &c = a;

decltype(a+1) a1; //a1的类型为int
decltype(100L) aa;//aa的类型为long
decltype(b+c) bc; //bc的类型为int,虽然b和c都是引用,但b+c不是引用,而是两个int的和,因此bc的类型也为int

2. 返回类型后置

C++11新增加了一种函数声明的语法:在函数名和参数后面指定返回类型。该语法与auto搭配使用,其使用形式如下所示:

auto fun(int a, int b) - > int

该语法主要是为了解决某些模板函数返回值类型问题,例如下面这个模板函数:

template< typename T, typename U >
??? fun(T t, U u)
{
    ...
    return t + u;
}

该模板函数的返回值如何确定呢?首先很容易想到的是将decltype(t+u)设置为该模板函数的返回值,但是不行的是,此时还未声明xy,编译器还识别不到他们,更无法使用他们,因此,C++11新增了返回值类型后置的这种语法,针对上述的模板函数,使用新增的语法可以写为:

template< typename T, typename U >
auto fun(T t, U u) - > decltype(t + u) //此时decltype在参数t和u声明的后面,可以正常使用他们
{
    ...
    return t+u;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6958
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3349
收藏 人收藏

    评论

    相关推荐

    C++打印类型名称的分析与实现

    打印类型名称,听起来像是一个很简单的需求,但在目前的C++当中,并非易事。
    发表于 10-20 14:08 1372次阅读

    STM32 C++串口类

    使用方法:1. 添加cpp文件到c++工程中2.实例化一个串口对象SerialPort1serial;3.测试:serial
    发表于 01-30 22:19

    C++标准库学习笔记重点

    in each C++versionvector;//OK since C++113.以auto声明的变量,其类型会根据初值被自动推导出来。auto i=42;//i has type intvector
    发表于 10-23 20:28

    学习C++方法以及C++的就业方向

    学习方向:嵌入式+人工智能嵌入式是一门技术学习目标1.嵌入式开发概述;(面向对象在嵌入式开发中角色)2.嵌入式Linux C++编程;(C++概述、C++学习方法
    发表于 12-24 07:32

    C++教程第三章数据类型

    C++教程第三章数据类型 什么是数据类型一定的数据在计算机的内部表示;该数据所表示的值的集合;在该数据上的一系列操作。
    发表于 05-15 17:56 48次下载

    turbo c 2.0使用说明,使用方法,使用指南

    turbo c 2.0使用说明,使用方法 在开始看本文以前,我先说明一下C语言的安装和使用中最应该注意的地方:许多网友在下载Turbo C 2.0和Turbo
    发表于 09-18 09:51 3313次阅读

    C++内存泄漏分析方法

    C++是一种非常流行的计算机编程语言,在使用的过程中容易出现内存泄漏问题,而该问题往往难以识别。给出了一种对C++内存泄漏问题进行分析的方法,该方法得到
    发表于 11-23 11:19 5次下载
    <b class='flag-5'>C++</b>内存泄漏分析<b class='flag-5'>方法</b>

    VISUAL C++教程之VISUAL C++的安装和使用方法

    本文档的主要内容详细介绍的是VISUAL C++教程之VISUAL C++的安装和使用方法资料免费下载。
    发表于 12-27 16:32 19次下载
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安装和<b class='flag-5'>使用方法</b>

    Visual C++教程之C++的语言资料概述免费下载

    本文档详细介绍的是Visual C++教程之C++的语言资料概述免费下载主要内容包括了:1 从CC++的程序结构 ,2 程序书写规范,3 数据类型
    发表于 02-15 15:59 3次下载
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的语言资料概述免费下载

    c++ 之布尔类型和引用的学习总结

    c语言里面我们知道是没有布尔数据类型的,而在C++中添加了布尔数据类型(bool),它的取值是:true或者false(也就是1或者0),在内存大小上它占用一个字节大小。
    的头像 发表于 12-24 18:03 567次阅读

    oracle-C#使用方法

    oracle-C#使用方法(电源技术指标包括电源效率)-该文档为oracle-C#使用方法讲解文档,是一份还算不错的参考文档,感兴趣的可以下载看看
    发表于 09-28 09:38 6次下载
    oracle-<b class='flag-5'>C</b>#<b class='flag-5'>使用方法</b>

    现代C++之模板类型推导

    传统C++中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖慢我们的开发效
    的头像 发表于 03-02 16:18 831次阅读

    C++学习笔记之c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助的。这篇文章将从一个经典的程序开始介绍C++
    的头像 发表于 03-17 13:57 694次阅读

    C++的引用和指针

    之前的文章我们已经介绍了C++中的基本类型如int,bool和double等,除了基本类型C++还有一些更复杂的数据类型复合
    的头像 发表于 03-17 14:00 601次阅读

    C++中实现类似instanceof的方法

    函数,可实际上C++中没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java中的instanceof的功能。 在 C++ 中,确定对象的
    的头像 发表于 07-18 10:16 521次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的<b class='flag-5'>方法</b>