这是 C ++ Primer 5th edition 的练习,其中包括:
练习6.24:解释以下功能的行为。如果代码中存在问题,请说明它们是什么以及如何解决它们。
void print(const int ia[10])
{
for (size_t i = 0; i != 10; ++i)
cout << ia[i] << endl;
}
我在代码中找不到任何问题。这个练习有什么意义?
答案 0 :(得分:9)
一般问题是在C ++声明语法中,函数参数声明中的数组类型意味着非直观的:声明为T[]
或T[10]
或T[1279]
的参数实际上是声明为T*
- 所有这些参数声明都相同。*
请记住,C ++中没有数组类型的prvalues,因此数组类型不能是函数参数或返回类型。 (当用作prvalue时,数组衰减到指向其第一个元素的指针。)
因此,您的函数声明实际上是(使用T = const int
):
void print(const int *);
此参数类型适用于数组到指针的衰减,但现在很清楚,您可以将任何指针传递给int
到此函数,以及正确性函数执行不能仅从函数定义中确定。
在旁注中,数组 glvalues 完全正常,下面的函数有一个参数类型为&#34;引用数组&#34;:
void print10(const int (&a)[10])
{
for (auto i : a) { std::cout << i << "\n"; }
}