繁体   English   中英

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

[英]Is it legal to have a function pointer template parameter accept an 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中的错误? 如果是这样,有人知道它是否可以在更高版本中使用吗?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM