std :: declval <T>()`没有匹配功能是什么原因?

时间:2019-10-06 11:28:22

标签: c++ language-lawyer declval

我惊讶地发现对于某些Tdecltype(std::declval<T>())是不合法的:

#include <utility>

template<typename T>
using Alias = decltype(std::declval<T>());

// as expected
using A1 = Alias<int>;
using A2 = Alias<int(int)>;

// error: no matching function for call to 'declval<...>()'
using A3 = Alias<int(int) const>;
using A4 = Alias<int(int) volatile>;
using A5 = Alias<int(int) &>;
using A6 = Alias<int(int) &&>;
// and all combinations of the above

cppreference似乎并不表明该错误是预期的。

是否有不能使用declval<T>的其他类型?规范在哪里定义这些?

1 个答案:

答案 0 :(得分:5)

每个[declval]declval签名是:

template <class T>
add_rvalue_reference_t<T> declval() noexcept;

因此,如果add_rvalue_reference_t<T>不能作为返回类型说明符出现,则呼叫格式错误。

合格的函数类型有一个特殊规则:

  

具有 cv-qualifier-seq ref-qualifier 的函数类型   (包括以 typedef-name ([dcl.typedef]   [temp.param]))仅应显示为:

     
      
  • (6.1)非静态成员函数的函数类型

  •   
  • (6.2)指向成员的指针所引用的函数类型,

  •   
  • (6.3)函数typedef声明或 alias-declaration

  • 的顶级函数类型   
  • (6.4) type-parameter 的默认参数中的 type-id ,或

  •   
  • (6.5) type-parameter ([temp.arg.type])的模板参数的 type-id

  •   

它们不能是返回类型说明符。

翻阅Types,我很确定限定条件的函数类型是唯一的情况。