使用Microsoft Visual Studio 2012,我尝试编译以下内容:
template <void (*f)(int && y)>
void foo() {}
并收到此错误:
error C2993: 'int &&' : illegal type for non-type template parameter 'y'
这真的是非法的吗?或者这是MSVS中的错误?如果是这样,有人知道它是否适用于更高版本?
答案 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一样:只需从函数类型中删除参数名称 - 我能够测试的所有编译器都接受这个。