让函数指针模板参数接受右值引用合法吗
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合格)类型:
- 积分或枚举类型
- 指向对象的指针或指向函数的指针
- 对对象的左值引用或对函数的左值参考
- 指向成员的指针
- CCD_ 1
解决方法如评论中提到的jrok:只需从函数类型中删除参数名称——我能够测试的所有编译器都接受这一点。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题