
⑴如图,行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)
谢谢
文章探讨了C++中的declval()函数,其返回类型为add_rvalue_reference_t<_Ty>。Add_reference模板类有泛化和特化两个版本,void_t的定义在推导过程中起到关键作用,确保了在合法引用运算时进行泛型推导,否则会调用特化版本。这一过程是基于C++的模板机制和类型推导规则。
&spm=1001.2101.3001.5002&articleId=131426768&d=1&t=3&u=d81014b4dcf443aeb38d58ae74af5193)
1056

被折叠的 条评论
为什么被折叠?



