【发布时间】:2014-09-19 06:36:04
【问题描述】:
在本例中,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 的语言设计错误,为了向后兼容而保留了它们。
-
@BenjaminLindley。编译器报告 C 程序尝试将 [5] 数组作为 [10] 数组传递的问题是什么?这不会破坏任何兼容性,而是有助于发现一些旧代码中的潜在错误。
-
数组类型的参数实际上并不是数组类型。它是一个指针。
-
@bkxp 这是真的,我同意。但是从编译器的角度来看,函数参数
char c[10]完全等同于char* c,并且仅用于文档目的。该函数需要一个指针,仅此而已。应该避免这种“成语”。 -
@Benjamin Lindley。如果是这样,那么第一个模板也不起作用。但它返回数组的大小就好了。