静的に割り当てられた配列を参照渡しする方法は?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
(&myArray)[100]
参照することにより任意の配列を渡すために何の意味やそのわずかな構文がありますか?ここでは、括弧とそれに続く大括弧が別々に理解できません。ありがとう。
静的に割り当てられた配列を参照渡しする方法は?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
(&myArray)[100]
参照することにより任意の配列を渡すために何の意味やそのわずかな構文がありますか?ここでは、括弧とそれに続く大括弧が別々に理解できません。ありがとう。
回答:
これは、配列参照の構文です- (&array)
(無効な)参照の配列ではなく、配列への参照が必要であることをコンパイラに明確にするために使用する必要がありますint & array[100];
。
編集:いくつかの明確化。
void foo(int * x);
void foo(int x[100]);
void foo(int x[]);
これら3つは、同じ関数を宣言する異なる方法です。それらはすべてint *
パラメータを取るものとして扱われ、任意のサイズの配列を渡すことができます。
void foo(int (&x)[100]);
これは100個の整数の配列のみを受け入れます。あなたは安全に使用することができますsizeof
のx
void foo(int & x[100]); // error
これは「参照の配列」として解析されます-これは合法ではありません。
int a, b, c; int arr[3] = {a, b, c};
ですか?
void foo(int & x[100]);
が「参照の配列」として解析される理由を誰かが説明できますか?「右から左へ」というルールが原因ですか?はいの場合、void foo(int (&x)[100]);
「配列への参照」として解析される方法と一致しないようです。前もって感謝します。
これは必要な構文です。
void Func(int (&myArray)[100])
^ int
パラメータ名がである参照により100の配列を渡しますmyArray
。
void Func(int* myArray)
^配列を渡します。配列はポインタに減衰します。したがって、サイズ情報が失われます。
void Func(int (*myFunc)(double))
^関数ポインタを渡します。関数はを返し、int
を受け取りますdouble
。パラメータ名はmyFunc
です。
構文です。関数の引数ではint (&myArray)[100]
、を囲む括弧&myArray
が必要です。それらを使用しない場合は、が渡されます。array of references
これは、subscript operator []
がに優先されるためです。& operator
。です。
例えば int &myArray[100] // array of references
したがって、を使用しtype construction ()
て、100の整数の配列への参照が必要であることをコンパイラに伝えます。
例えば int (&myArray)[100] // reference of an array of 100 ints
array of references
」-もちろん、これは存在できないため、コンパイルエラーが発生します。とにかく、これはデフォルトで発生するはずであると演算子の優先順位ルールが主張しているのは面白いです。
配列はデフォルトでポインタによって渡されます。理解を深めるために、関数呼び出し内で配列を変更してみてください。
char arr[1]; foo(char arr[]).
、arrはポインタに低下します。の使用中char arr[1]; foo(char (&arr)[1])
、arrは参照として渡されます。次元が失われているため、前者のフォームは誤った形式であると見なされることがよくあります。
foo(T* t)
があり、配列があるT a[N];
場合、書くときは、配列foo(a);
ではなくポインタを渡し、値によってポインタを渡すと言った方が正しいと思います。
以下は、参照により任意のサイズおよび任意のタイプの配列をとるジェネリック関数を作成します。
template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
// do stuff
}