提问者:小点点

为什么在可推论类型列表中没有指向函数类型的指针


template<typename T>
struct Test{};  

template<typename Ret, typename...Args>
struct Test<Ret(*)(Args...)>{
    using type = int;
};
void func(int){}
int main(){
  Test<decltype(&func)>::type b;
}

如果类型pret(*)(args...),而相应的参数类型avoid(*)(int),则推演尝试从a中推演模板参数,但是这种形式没有列在下面的列表中,该列表指定可以推演的类型的形式。

Temp.Deduct.Type#8

一个模板类型论元T,一个模板模板论元TT或一个模板非类型论元i,如果P和A具有下列形式之一,就可以推导出来:

  • T
  • CV-List T
  • T*
  • T&;
  • T&&
  • T[整数-常数]
  • template-name(其中template-name指的是类模板)
  • 类型(T)
  • T()
  • T(T)
  • T类型::*
  • 类型t::*
  • t t::*
  • t(类型::*)()
  • 类型(t::*)()
  • 类型(type::*)(T)
  • 类型(T::*)(T)
  • T(类型::*)(T)
  • T(t::*)()
  • T(T::*)(T)
  • 类型[i]
  • template-name(其中template-name指的是类模板)
  • TT
  • TT
  • tt<;>

这个列表指定了很多函数类型的指针,但是没有,只有诸如T(T)这样的函数类型被包含,所以为什么这个列表中没有函数类型的指针,这样的类型应该是可以推导的。


共1个答案

匿名用户

指向函数的指针类型ret(*)(args.。。)只不过是t*,其中tret(args.。。)

编辑:进一步的检查证明这是不够的。