(1) decltype 可以让推断其参数的类型。按住 ctrl 点击 decltype ,会发现无法查阅 其定义 :
(2) 但 STL 库里咱们可以查阅函数 declval 的 定义,很短,摘抄如下:
template <class _Ty, class = void> // add reference (non-referenceable type)
struct _Add_reference
{ using _Lvalue = _Ty;using _Rvalue = _Ty;
};/*
template <class... _Types>
using void_t = void;
*/
template <class _Ty>
struct _Add_reference<_Ty, void_t<_Ty&>> // (referenceable type)
{ using _Lvalue = _Ty&;using _Rvalue = _Ty&&;
};template <class _Ty>
using add_rvalue_reference_t = typename _Add_reference<_Ty>::_Rvalue;template <class _Ty>
add_rvalue_reference_t<_Ty> declval() noexcept;
可见,能总结出 : declval 函数返回了对其模板参数的右值引用。当不能为模板参数的对象添加引用,则返回模板参数本身。
(3) 结合 std::declval 的定义,比较好掌握使用其的语法。然后用例子测试一下其用法:
再修改下函数 f ,再测试一个有函数返回值的例子:
谢谢阅读