[英]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.