c++ 的declval 的泛型推导分析(1)

文章探讨了C++中的declval()函数,其返回类型为add_rvalue_reference_t<_Ty>。Add_reference模板类有泛化和特化两个版本,void_t的定义在推导过程中起到关键作用,确保了在合法引用运算时进行泛型推导,否则会调用特化版本。这一过程是基于C++的模板机制和类型推导规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
⑴如图,行20 的 declval() 函数 ,返回值类型是 add_rvalue_reference_t<_Ty> 类型 。 add_rvalue_reference_t<_Ty> 定义在17行。
⑵ 类模板 _Add_reference<_Ty> 又定义了泛化版本行7与特化版本行12。
⑶由行4 的 void_t 的定义知,不管T 是什么 , void_t 都等于 void 这个 c++ 关键字。但前提是题目中的 _Ty 可以接受 & 这个引用运算符。若本身不存在 _Ty& 这个运算(或者说本运算非法),那么也不会进行 void_t<_Ty&> 的泛型推导,这时候就会调用 模板 _Add_reference<_Ty>的泛化版本。但有特化版本合适的情况下,肯定先匹配其特化版本。如此 _Add_reference<_Ty>::_Rvalue 就有合适的值了。
⑷ 以上对于模板泛型推导的过程,受b站类似的包含void_t的推导
这位老师的启发。谢谢这位大师。

(5)关于 declval() 的讲解,本系列还有另一篇文章,加个超链接 : declval()

(6)多月后的继续补充,那么什么类型不运行被引用呢, & 运算符非法呢? void 类型

在这里插入图片描述

(7)declval ( ) 返回普通类型的右值引用,返回左值引用的左值引用(因为引用折叠)

在这里插入图片描述

(8)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值