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

时间:2014-10-29 13:39:14

标签: c++ templates visual-c++ function-pointers rvalue-reference

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

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

并收到此错误:

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

这真的是非法的吗?或者这是MSVS中的错误?如果是这样,有人知道它是否适用于更高版本?

1 个答案:

答案 0 :(得分:1)

这确实是VS2012编译器中的拒绝有效错误,它被函数类型中的参数名称混淆,认为函数类型的参数是模板参数,因此投诉。 C ++ 11模式下的G ++ 4.8和4.9接受此代码,Clang 3.3和ICC 13也是如此。这是使用Godbolt's interactive compiler检查的。另外,根据N3337 14.1(temp.param)p4,允许对函数的指针和左值引用,而不限制函数参数或返回类型:

  

非类型模板参数应具有以下之一(可选)    cv-qualified )类型:

     
      
  • 整数或枚举类型,
  •   
  • 指向对象或指向函数的指针,
  •   
  • 对对象的左值引用或对函数的左值引用,
  •   
  • 指向成员的指针,
  •   
  • std::nullptr_t
  •   

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