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 と参照を使用することをお勧めします。私はそれを実装しようとしています (私は初心者です) 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

参照への参照、参照の配列、および参照へのポインタがあってはなりません。

鉱山を強調します。

標準が参照の配列を明示的に禁止している理由の 1 つ (おそらくもっとある) は、配列のインデックス方法のためです。次のようにします。

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

ここにはいくつかの間違いがあります。まず、参照へのポインタがありますが、これは違法です。第 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 になります。

これが、参照の配列が不正である理由です。

于 2012-10-19T19:14:06.897 に答える