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

时间:2014-09-19 06:36:04

标签: c++ arrays templates size

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

这段代码在没有产生警告的情况下编译的事实对我来说是一个惊喜。如果实现了数组大小检查,它将使代码更安全,第二个模板也将编译并正常工作。 这种编译器行为背后的原因是什么?

1 个答案:

答案 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 ++对模板使用的特定大小的数组的引用遵循了这一点。