4

ここでSFINAEに関するlitbの質問を読んでいて、彼のコードが何を宣言しているのか正確に疑問に思っていました。より単純な (テンプレートを使用しない) 例を以下に示します。

int (&a())[2];

それは一体何を宣言しているのでしょうか。& の役割は何ですか? 私の混乱に加えて、代わりに次のように宣言すると

int b()[2];

配列を返す関数の宣言に関するエラーが表示されますが、最初の行にはそのようなエラーはありません (したがって、最初の宣言は関数ではないと考えられます)。ただし、割り当てようとすると

a = a;

関数を割り当てようとしているというエラーが表示されます...だから、今関数です。これは正確には何ですか?

4

3 に答える 3

17

cdecl および c++decl と呼ばれるすばらしいプログラムがあります。これらは、複雑な宣言を理解するのに非常に役立ちます。特に、C および C++ が関数ポインターに使用するビザンチン形式の場合に役立ちます。

tyler@kusari ~ $ c++decl
Type `help' or `?' for help
c++decl> explain int (&a())[2]
declare a as function returning reference to array 2 of int
c++decl> explain int b()[2]
declare b as function returning array 2 of int

a は参照を返しますが、b は返しません。

于 2009-06-21T17:18:03.923 に答える
8

今後の参考のために、解読が特に難しい C/C++ 宣言がある場合は、このリンクが役立つ場合があります。

C 宣言の読み方

完全を期すために、他の人があなたの質問に直接答えるために言ったことを繰り返します。

int (&a())[2];

... aは、サイズ 2 の整数配列への参照を返す引数のない関数であると宣言します (上記のリンクの基本ルールを読んで、私がどのようにそれを思いついたかを明確に理解してください)。

int b()[2];

... bは、サイズ 2 の整数配列を返す引数なしの関数であることを宣言します。

お役に立てれば。

于 2009-06-21T17:26:56.097 に答える
2
int (&a())[2];

aこれは、引数を取らず、整数の 2 要素配列への参照を返す関数であるシンボルを宣言します。

 int b()[2];

bこれは、引数を取らず、整数の 2 要素配列を返す関数であるシンボルを宣言します... これは、言語の設計上不可能です。

それは比較的簡単です: 演算子の優先順位チャートを取得し、シンボル名 ( a) を開始し、優先順位からわかるように演算子の適用を開始します。各操作を適用した後に書き留めます。

于 2009-06-21T17:20:18.540 に答える