为什么C++中的参数匹配忽略数组大小

Why does argument matching in C++ ignore array sizes?

本文关键字:数组 C++ 参数 为什么      更新时间:2023-10-16

在本例中,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);
}

事实上,这段代码在编译时甚至没有生成警告,这让我感到惊讶。如果实现数组大小检查,将使代码更安全,第二个模板也会编译并正常工作。这种编译器行为背后的原因是什么?

就像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++引用了一个特定大小的数组,您的模板使用这个数组。