让函数指针模板参数接受右值引用合法吗

Is it legal to have a function pointer template parameter accept an rvalue reference?

本文关键字:引用 指针 函数 参数      更新时间:2023-10-16

使用Microsoft Visual Studio 2012,我尝试编译以下内容:

template <void (*f)(int && y)>
void foo() {}

并得到这个错误:

error C2993: 'int &&' : illegal type for non-type template parameter 'y'

这真的违法吗?或者这是MSVS中的一个错误?如果是,有人知道它在以后的版本中是否有效吗?

这确实是VS2012编译器中的一个拒绝有效错误,它被函数类型中的参数名称弄糊涂了,以为函数类型的参数是模板参数,因此引发了投诉。C++11模式下的G++4.8和4.9接受此代码,Clang 3.3和ICC 13也接受此代码;这是使用Godbolt的交互式编译器进行检查的。此外,根据N3337 14.1(temp.param)p4,允许对函数的指针和左值引用,而不限制函数参数或返回类型:

非类型模板参数应具有以下内容之一(可选cv合格)类型:

  • 积分或枚举类型
  • 指向对象的指针或指向函数的指针
  • 对对象的左值引用或对函数的左值参考
  • 指向成员的指针
  • CCD_ 1

解决方法如评论中提到的jrok:只需从函数类型中删除参数名称——我能够测试的所有编译器都接受这一点。