1

我写了这样的代码:

 void Print(const int & dataArray[], const int & arraySize) {  // problem 
    for(int i = 0; i<arraySize; i++) {
        cout << dataArray[i] << " ";
    }
    cout << endl;
    }

在 mian() 函数中:

`
int iArray[14] = { 7, 3, 32, 2, 55, 34, 6, 13, 29, 22, 11, 9, 1, 5 }; 
int numArrays = 14;
Print(iArray, numArrays);
....
`

编译器说引用数组是非法的,为什么它是非法的?我看到<effective c++>,上面说推荐我们使用const和reference,我只是尝试实现它(我是初学者),我也想知道在void Print(const int dataArray[], const int & arraySize)参数中我使用const,&来限定arraySize,对吗?(或者它比 int arraySize 或 const int arraySize 好得多?),我也想使用 const,& 到 dataArray[],但我失败了。

4

2 回答 2

7

数组要求其元素是默认可构造的,而引用不是,因此引用数组是非法的。这个:

const int & dataArray[]

是一个引用数组。如果你想引用一个数组,你需要这个:

const int (&dataArray)[]
于 2012-10-19T17:46:22.087 回答
2

学究式地,引用数组非法的原因是标准明确禁止它们。

C++03:8.3.2/4

不能有对引用的引用,不能有引用数组,也不能有指向引用的指针。

强调我的。

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

Gizmo& gizmos[] = {...};
Gizmo&* g3 = &gizmos[2];

这里有几件事是错误的。首先,您有一个指向引用的指针,这是非法的。其次,为了评估gizmos[2]编译器必须进行隐式转换为指针,然后基于此进行指针运算。有多大Gizmo&

根据标准,sizeofa 引用本身是未指定的。但是,当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。

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

于 2012-10-19T19:14:06.897 回答