2

ここから:https ://stackoverflow.com/a/3473454/499125

int ( &fillarr( int (&arr)[5] ) )[5] { // no decay; argument must be size 5
    return arr;
}

上記の定義により、コンパイラーはパラメーターのサイズを認識できるようになります。この声明は私には複雑に思えます。誰かがこのステートメントの構造を説明したり、ステートメントがどのようにサイズ認識を達成するかを説明したりできますか?

これを拡張して複数のパラメーターを処理できますか?

4

2 に答える 2

8

要するに、宣言を読むことができるということです。まったく同じように書く簡単な方法は次のとおりです。

typedef int int5[5]; // create a typedef
int5& fillarr( int5& ) {
}

元の宣言を正確に読み取る方法として、それを細かく分割してください。

int (&fillarr( int (&arr)[5] ))[ 5 ];
               ^^^^^^^^^^^^^           // A: reference to array of 5 int
^^^^^^                        ^^^^^^   // B: reference to array of 5 int
      ^^^^^^^^               ^         // C: function taking A and returning B
于 2012-08-20T16:15:56.217 に答える
2

これを理解することは、1)戻り値と2)パラメータタイプの2つの部分に分けることができます。

int ( &fillarr() )[5] {
  static int arr[5];
  return arr;
}

タイプを見ることができます:int (&fillarr())[5]。これを理解するために、残念ながら古いCルール:「宣言は式での使用法に似ています」は参照では機能しないため、代わりに同様の宣言を見てみましょう。

int (*fillarr())[5];

これは、サイズ5の配列への参照ではなく、ポインターを返す関数です。どうすればわかりますか?さて、intの配列へのポインタを返す関数があると仮定すると、5番目の要素にどのようにアクセスしますか?見てみましょう。最初に関数を呼び出す必要があります。次に、結果を逆参照してから、5番目の要素(存在しませんが、無視します)にアクセスする必要があります。これはまさに宣言構文です。ff()*f()(*f())[5]int

int x;
int (*f())[5];
x = (*f())[5];
//    ^^^-------- call f -> yields pointer to array of 5 ints
//   ^----------- dereferene the result of f -> yields array of 5 ints
//        ^^^---- access the fifth element

これで、例で参照を返すため、*をの代わりに使用するだけです。&

パラメータ構文も同様に機能します。

于 2012-08-20T16:16:18.397 に答える