使用2012,我尝试编译以下内容:
template <void (*f)(int && y)>
void foo() {}得到这个错误:
error C2993: 'int &&' : illegal type for non-type template parameter 'y'这真的违法吗?或者这是MSVS中的一个bug?如果是的话,有人知道它在以后的版本中是否有效吗?
发布于 2014-10-29 20:02:33
这确实是‘s 2012编译器中一个无效的错误,它被函数类型中的参数名称弄糊涂了,认为函数类型的参数是模板参数,因此出现了抱怨。G++ 4.8和4.9在C++11模式下接受此代码,Clang3.3和ICC 13也是如此;这是使用哥德波特交互式编译器检查的。此外,根据N3337 14.1 (temp.param) p4,不受函数参数或返回类型的限制,允许指向函数的指针和lvalue引用:
非类型模板参数应具有下列类型之一(可选cv限定类型):
std::nullptr_t。解决方法如注释中提到的jrok所示:只需从函数类型中删除参数名称--所有我能够用它进行测试的编译器都接受它。
https://stackoverflow.com/questions/26631872
复制相似问题