web-dev-qa-db-ja.com

参照による配列引数の受け渡し

このシグネチャを持つ関数に出くわしました。

void foo(char (&x)[5])
{
}

これは、固定サイズのchar配列を参照で渡すための構文です。

&xの前後に括弧が必要であるという事実は、私を珍しいと思います。

これはおそらくC++ 03標準の一部です。

このフォームは何と呼ばれ、誰もが標準への参照を指摘できますか?

c ++ declはまだ友達ではありません:

$ c++decl 
Type `help' or `?' for help
c++decl> explain void foo(char (&x)[5])
syntax error
15
Eddy Pronk

説明するものは何もありません。これは、C++で宣言の解析ルールがどのように機能するかを示しています。

_char  & x[5] // declare x as array 5 of reference to char (not valid C++!)
char (&x)[5] // declare x as reference to array 5 of char
_

注意:ただし、参照の配列を持つことができないため、最初のバージョンは有効なC++ではありません。これは、宣言構文の説明にすぎません。 (これを正しく行うのに時間がかかりすぎて申し訳ありません。有益なコメントに感謝します!)

必要に応じて、型識別子を括弧の任意のレベルでラップすることができます。したがって、char &(x)[5](最初のケース)またはchar (((&x)))[5](2番目のケース)と言うこともできます。

11
Kerrek SB

c++decl主にこれで機能します。それはあなたがそれを与えるものについて少しうるさいです。

c++decl> explain void foo(char (&)[5])
declare foo as function (reference to array 5 of char) returning void

c++decl> explain void foo(char &[5])
declare foo as function (array 5 of reference to char) returning void

別の回答で述べたように、参照の配列は違法です。 GNU C++コンパイラのレポート:

エラー:参照の配列としての「x」の宣言

ちなみに、 here は、cdeclを提供するオンラインユーティリティへのリンクです(ただし、サイトでホストされているバージョンはC固有であるため、参照について文句を言います)。

0
nobar