将声明为`extern char []`的变量传递给VC ++中的函数模板时出错

时间:2014-07-09 00:51:44

标签: c++ templates visual-c++ gcc clang

考虑以下(人为)示例:

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 ++会在其他编译器接受代码时出现此错误以及如何避免此错误?

2 个答案:

答案 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;没有被标准定义。