0

「C++ オブジェクト モデルの内部」で、著者は次のコードの例を示しています。これは潜在的にあいまいであり、パーサーがそれを解決するために先読みする必要があります。

...C++ が C 宣言構文を放棄した場合、以下がその定義ではなく pf の呼び出しであると判断するために先読みは必要ありません。

// don’t know if declaration or invocation 
// until see the integer constant 1024 
int ( *pf )( 1024 );

彼は、これが関数の呼び出しとして解釈されることをほのめかしていますpfpfこれを有効な呼び出しにするための宣言が何であるかわかりません。

4

2 に答える 2

2

int*これは、呼び出し元が値1024で初期化されているという醜い宣言pfです。ただし、この変換は、明示的なキャストがないと有効ではありません。

int ( *pf )((int*)1024);

したがって、質問で与えられた行は次と同等です。

int* pf = 1024;

理由を理解するために、それint ((((*pf))));はと同じであると考えてint* pf;ください。宣言子の周りには、必要な数の括弧を付けることができます。

T D含まれDているdeclarator -id
( D1 )
のタイプが宣言に含まれているdeclarator-idのタイプと同じである宣言では、括弧は埋め込まれたdeclarator-id
T D1
のタイプを変更しませんが、複合体のバインディングを変更できます。宣言子。

これが関数呼び出しと見なされる理由はわかりません。特にそれがで始まることを考えるとint。整数リテラルが表示されるまで、関数ポインタの宣言である可能性があります。たとえば、これがあった場合:

int ( *pf )(int);

これは、型の単一の引数を返し、取るpf関数への型ポインタの宣言になります。intint

于 2013-03-15T10:47:52.423 に答える
2

int ( *pf )( int);- 宣言です

于 2013-03-15T10:36:44.577 に答える