(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 ,再測試一個有函數返回值的例子:
謝謝閱讀