【问题标题】:Error when passing a variable declared as `extern char[]` to a function template in VC++将声明为“extern char[]”的变量传递给 VC++ 中的函数模板时出错
【发布时间】:2014-07-09 00:51:44
【问题描述】:

考虑以下(人工)示例:

template <typename T>
void f(const T&) {}

extern char test[];

int main() {
  f(test);
}

char test[] = "";

GCC 和 Clang 都编译成功,但是 Visual C++ 报错:

test.cc(7): error C2664: 'f' : cannot convert parameter 1 from 'char []' 到 'const char (&)[1]' [...vcxproj] 原因:无法从 'char []' 转换为 'const char [1]' 没有可以进行这种转换的上下文

为什么 VC++ 会给出这个错误,而其他编译器接受该代码以及如何避免这个错误?

【问题讨论】:

  • 为避免错误,请停止使用 C 样式数组...它们没有正确的值语义

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


【解决方案1】:

引用 C++11 8.3.5-8:

如果参数的类型包括“指向 T 的未知边界数组的指针”或“引用”形式的类型 到 T 的未知边界的数组,”程序格式错误。

在调用f(test)时,test的类型为char []T被扣除为char []。那么f会有const char(&amp;)[]类型的参数,这是不允许的。

所以 VC++ 是对的。如果它接受这个,它可能是编译器的扩展或错误。

【讨论】:

    【解决方案2】:

    事实证明,这是一个C++ Language Core Language Issue 393,提议的解决方案是删除该条款

    如果参数的类型包括“pointer to”形式的类型 T 的未知边界数组”或“对未知边界数组的引用 的 T,”程序是不正确的。

    GCC 和 Clang 都是这样做的。尽管标准未定义术语“包含类型”,但 EDG 前端(由 Visual C++ 使用)开发人员选择在这种情况下发出错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 2020-10-23
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多