在此示例中,getSize()返回数组的大小。
template <class T, size_t N>
size_t getSize(T(&array)[N])
{
return N;
}
虽然此代码无法编译:
template <class T, size_t N>
size_t getSize(const T array[N])
{
return N;
}
经过一些研究后我得出结论,这意味着C ++会允许这样的东西:
void func(char c[10]) {}
int main()
{
char c[5];
func(c);
}
这段代码在没有产生警告的情况下编译的事实对我来说是一个惊喜。如果实现了数组大小检查,它将使代码更安全,第二个模板也将编译并正常工作。 这种编译器行为背后的原因是什么?
答案 0 :(得分:3)
与C ++中的许多其他内容一样,“因为C就是这样做的” (C中的很多东西都是它们的方式,因为B或BCPL就是这样做的。)
在C ++中,如在C
中void foo(int p[10]);
相当于
void foo(int p[]);
相当于
void foo(int *p);
也就是说,参数看起来像一个数组,但实际上是一个指针 该函数的数组参数被隐式转换为指向其第一个元素的指针。
C和C ++都允许您将指针传递给特定大小的数组,例如
void foo(int (*p)[10]);
// ...
int a[10];
int b[20];
int *c;
foo(&a); // OK
foo(&b); // Not OK
foo(c); // Not OK
和C ++对模板使用的特定大小的数组的引用遵循了这一点。