为什么 T `std::declval<T>()` 没有匹配函数?
For what T does `std::declval<T>()` not have a matching function?
我很惊讶地发现对于某些 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>
的类型?规范在哪里定义这些?
根据 [declval],declval
的签名是:
template <class T>
add_rvalue_reference_t<T> declval() noexcept;
因此,如果 add_rvalue_reference_t<T>
不能作为 return 类型说明符出现,则调用格式错误。
限定函数类型有一个特殊规则:
A function type with a cv-qualifier-seq or a ref-qualifier
(including a type named by typedef-name ([dcl.typedef],
[temp.param])) shall appear only as:
(6.1) the function type for a non-static member function,
(6.2) the function type to which a pointer to member refers,
(6.3) the top-level function type of a function typedef declaration or alias-declaration,
(6.4) the type-id in the default argument of a type-parameter, or
(6.5) the type-id of a template-argument for a type-parameter ([temp.arg.type]).
它们不能是 return 类型说明符。
查看 Types,我很确定合格的函数类型是唯一的情况。
我很惊讶地发现对于某些 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>
的类型?规范在哪里定义这些?
根据 [declval],declval
的签名是:
template <class T>
add_rvalue_reference_t<T> declval() noexcept;
因此,如果 add_rvalue_reference_t<T>
不能作为 return 类型说明符出现,则调用格式错误。
限定函数类型有一个特殊规则:
A function type with a cv-qualifier-seq or a ref-qualifier (including a type named by typedef-name ([dcl.typedef], [temp.param])) shall appear only as:
(6.1) the function type for a non-static member function,
(6.2) the function type to which a pointer to member refers,
(6.3) the top-level function type of a function typedef declaration or alias-declaration,
(6.4) the type-id in the default argument of a type-parameter, or
(6.5) the type-id of a template-argument for a type-parameter ([temp.arg.type]).
它们不能是 return 类型说明符。
查看 Types,我很确定合格的函数类型是唯一的情况。