このシグネチャを持つ関数に出くわしました。
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
説明するものは何もありません。これは、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番目のケース)と言うこともできます。
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固有であるため、参照について文句を言います)。