我写了这样的代码:
void Print(const int & dataArray[], const int & arraySize) { // problem
for(int i = 0; i<arraySize; i++) {
cout << dataArray[i] << " ";
}
cout << endl;
}
in mian()函数:
`
int iArray[14] = { 7, 3, 32, 2, 55, 34, 6, 13, 29, 22, 11, 9, 1, 5 };
int numArrays = 14;
Print(iArray, numArrays);
....
`
编译器说引用数组是非法的,为什么它是非法的?
我看到&lt; effective c ++&gt;,它说我们建议使用const和引用,我只是尝试实现它(我是初学者),我也想知道void Print(const int dataArray[], const int & arraySize)
参数我使用const,&amp;为了限定arraySize,是不是?(或者它比int arraySize或const int arraySize好多了?),我也想使用const,&amp;到dataArray [],但我失败了。
答案 0 :(得分:7)
数组要求其元素是 default-constructible 而引用不是,因此引用数组是非法的。这样:
const int & dataArray[]
是一系列参考文献。如果你想要一个数组的引用,你需要这个:
const int (&dataArray)[]
答案 1 :(得分:2)
迂腐地说,引用数组是非法的原因是因为标准明确禁止它们。
不得引用引用,没有引用数组, 并没有指向参考的指针。
强调我的。
标准明确禁止引用数组(可能还有更多)的一个原因是因为数组的索引方式。假设您这样做:
Gizmo& gizmos[] = {...};
Gizmo&* g3 = &gizmos[2];
这里有几个问题。首先你有一个指向引用的指针,这是非法的。其次,为了评估gizmos[2]
,编译器必须执行隐式的转换指针,然后根据它进行指针运算。 Gizmo&
有多大?
根据标准,sizeof
引用本身是未指定的。但是,当sizeof
应用到引用时,结果就是引用类型的大小。
C++03:5.3.3/2 Sizeof
当应用于引用或引用类型时,结果为 引用类型的大小。
尝试运行此代码,看看会发生什么:
#include <iostream>
#include <iomanip>
using namespace std;
struct Gizmo { int n_[100]; };
int main()
{
typedef Gizmo& GR;
size_t n = sizeof(GR);
cout << n << endl;
}
当我在我的机器上运行它(MSVC10,Win7x64)时,结果为400.
这就是为什么引用数组是非法的。