繁体   English   中英

函数模板的C ++奇怪类型转换错误

[英]C++ Weird Type Conversion Error wtih Function Template

我有这些C ++代码:

在“ header1.h”中

template <typename T>
int  f1(const T& t1) {
    return 0;
}

extern const int  p[];

在cpptests.cpp中

#include "header1.h"
int _tmain(int argc, _TCHAR* argv[])  {
    f1(p);
    return 0;
}

在VC ++ 2010中,出现了此编译错误:

c:\work\cpptests\cpptests\cpptests.cpp(10): error C2664: 'f1' : cannot convert parameter 1 from 'const int []' to 'const int (&)[1]'
          Reason: cannot convert from 'const int []' to 'const int [1]'
          There is no context in which this conversion is possible
  Generating Code...

模板函数调用是否会将p转换为const int (&)[1]

变量p的类型是“ const int的未知边界数组”。 根据C ++ 11 8.3.5,“函数”,

如果参数的类型包括形式为“对T的未知边界数组的引用”的类型,则程序格式错误。

请允许我稍微思考一下为什么这很有意义:

您可能知道,即使类型T不完整,类型T *T &都是完整类型。 C ++包含一种奇怪的机制,通过这种机制,变量的类型可以通过完成而改变。 也就是说,您可以声明变量T x; 类型不完整,但稍后在变量的定义中完成类型。 例如,取T = int[]

extern int a[];    // `a` has incomplete type "array of unknown bound of int"
int a[10];         // now `a` has complete type "array of 10 int"

但是(参见3.9 / 6),现在假设我们还有另一个指针类型T *变量:

int (*p)[] = &a;   // `p` is a pointer to an array of unknown bound

此变量的类型已经完成,但是它的“数组”部分永远无法完成。 因此,即使a最终可能具有完整的类型,类型p也永远不会改变。 它的类型永远不会成为int (*)[10] 两种类型都已经完成,而后者不是前者的完成。

这意味着您永远无法使用 p来访问整个数组对象。 您仍然可以通过将*p衰减为指向数组第一个元素的指针来使用p (请注意*p是一个非常好的lvalue; glvalues不必具有完整的类型),但是您永远无法通过p看到整个数组。 (相同的理由适用于T & 。)

由于指向未知边界数组的指针和引用具有这种有限的用途,因此不允许将它们作为函数参数类型使用。 在您的情况下,推导类型恰好是“未知边界数组”类型,因此生成的程序格式错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM