首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于什么T,`std::declval<T>()`没有匹配的函数?

对于什么T,`std::declval<T>()`没有匹配的函数?
EN

Stack Overflow用户
提问于 2019-10-06 11:28:22
回答 1查看 318关注 0票数 3

我惊讶地发现,对某些T来说,decltype(std::declval<T>())是不合法的:

代码语言:javascript
复制
#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

优先选择似乎并不表示预期会出现此错误。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-06 11:56:58

根据[解密]declval的签名是:

代码语言:javascript
复制
template <class T>
add_rvalue_reference_t<T> declval() noexcept;

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

限定函数类型有一条特殊规则:

带有cv-限定符-seq或ref-限定符的函数类型(包括由ty胡枝子名称命名的类型(dcl.typedef,temp.param))只应显示为:

  • (6.1)非静态成员函数的函数类型,
  • (6.2)指向成员的指针所引用的函数类型,
  • (6.3)函数类型声明或别名声明的顶级函数类型,
  • (6.4)类型参数的默认参数中的类型id,或
  • (6.5)类型参数(temp.arg.type)的模板参数的类型id.

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

纵观类型,我很确定限定的函数类型是唯一的情况。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58256787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档