前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ decltype和返回类型后置

C++ decltype和返回类型后置

作者头像
艰默
发布2023-02-26 11:05:45
9500
发布2023-02-26 11:05:45
举报
文章被收录于专栏:iDoitnow

1. decltype

decltype的使用方式如下:

代码语言:javascript
复制
decltype(expression) var;

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

1)如果expression是一个没有用括号括起来的标识符,则var的类型与该标识符的类型相同。例如:

代码语言:javascript
复制
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的类型与函数的返回值类型相同。例如:

代码语言:javascript
复制
int sum(int a, int b){...}

decltype(sum(1,2)) m; //m的类型为int

3):如果expression的条件不满足1)、2),expression是一个左值,则var指向该左值类型的引用。例如:

代码语言:javascript
复制
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的类型。例如:

代码语言:javascript
复制
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 搭配使用,其使用形式如下所示:

代码语言:javascript
复制
auto fun(int a, int b) -> int

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

代码语言:javascript
复制
template<typename T, typename U>
??? fun(T t, U u)
{
    ...
    return t + u;
}

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

代码语言:javascript
复制
template<typename T, typename U>
auto fun(T t, U u) -> decltype(t + u) //此时decltype在参数t和u声明的后面,可以正常使用他们
{
    ...
    return t+u;
}

参考文献 C++ Primer Plus(第六版) - 第18章 探讨C++新标准

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iDoitnow 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. decltype
  • 2. 返回类型后置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档