⑴如图,行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)
谢谢