我惊讶地发现对于某些T
,decltype(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>
的其他类型?规范在哪里定义这些?
答案 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,我很确定限定条件的函数类型是唯一的情况。