我惊讶地发现,对于某些 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> 吗?规范在哪里定义这些?

最佳答案

对于 [declval]declval 的签名是:

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

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

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



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

查看 Types ,我很确定限定的函数类型是唯一的情况。

关于c++ - 对于什么 T `std::declval<T>()` 没有匹配函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58256787/

10-12 17:12