错误C2234:引用数组是非法的

时间:2012-10-19 17:44:12

标签: c++

我写了这样的代码:

 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 [],但我失败了。

2 个答案:

答案 0 :(得分:7)

数组要求其元素是 default-constructible 而引用不是,因此引用数组是非法的。这样:

const int & dataArray[]

是一系列参考文献。如果你想要一个数组的引用,你需要这个:

const int (&dataArray)[]

答案 1 :(得分:2)

迂腐地说,引用数组是非法的原因是因为标准明确禁止它们。

C ++ 03:8.3.2 / 4

  

不得引用引用,没有引用数组,   并没有指向参考的指针。

强调我的。

标准明确禁止引用数组(可能还有更多)的一个原因是因为数组的索引方式。假设您这样做:

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.

这就是为什么引用数组是非法的。