考虑以下(人为)示例:
template <typename T>
void f(const T&) {}
extern char test[];
int main() {
f(test);
}
char test[] = "";
GCC和Clang都成功编译,但Visual C ++出现以下错误:
test.cc(7):错误C2664:'f':无法从'char转换参数1 []'到'const char(&amp;)[1]'[... vcxproj] 原因:无法从'char []'转换为'const char [1]' 没有可以进行此转换的上下文
为什么VC ++会在其他编译器接受代码时出现此错误以及如何避免此错误?
答案 0 :(得分:3)
引用C ++ 11 8.3.5-8:
如果参数的类型包含“指向未知T的数组的指针”或“引用”的形式类型 对于T的未知界限的数组,“该程序是不正确的。
在调用f(test)
时,test
的类型为char []
,T
会被扣除char []
。然后f将具有const char(&)[]
类型的参数,这是不允许的。
所以VC ++是对的。如果接受这个,可能是编译器的扩展或错误。
答案 1 :(得分:0)
事实证明,这是一个C++ Language Core Language Issue 393,建议删除条款的解决方案
如果参数的类型包含“指向”的形式的类型 未知界限T“或”未知界限数组的数组 T,“该计划形成不良。
这是GCC和Clang都做的事情。 EDG前端(由Visual C ++使用)开发人员选择在这种情况下发出错误,尽管术语&#34;包括类型&#34;没有被标准定义。