ネストされたコンストラクター呼び出しとブレースに関するC++ FQA エントリを見て、 C ++ パーサーが 2 つを解決する方法と、パーサーがそれを解決できない理由を常に疑問に思っていました。
だから、なぜfoo xxx();
あいまいなのかがわかります。foo x(bar());
しかし、それは明らかに事前宣言ではないため、何が曖昧になります。(つまり、これをうまく検出できる文法が必要です)。
C++ 文法のその部分の制限とあいまいさを誰か説明できますか?
ネストされたコンストラクター呼び出しとブレースに関するC++ FQA エントリを見て、 C ++ パーサーが 2 つを解決する方法と、パーサーがそれを解決できない理由を常に疑問に思っていました。
だから、なぜfoo xxx();
あいまいなのかがわかります。foo x(bar());
しかし、それは明らかに事前宣言ではないため、何が曖昧になります。(つまり、これをうまく検出できる文法が必要です)。
C++ 文法のその部分の制限とあいまいさを誰か説明できますか?
foo x(bar());
これは次のいずれかです。
1)x
値がデフォルトで構築されたと呼ばれる変数の宣言bar
。これは と同じfoo x = bar();
です。
x
2) 単一のパラメーターを返し、受け取る関数の宣言foo
- a を返し、bar
パラメーターをとらない関数。これはfoo x(bar (void));
C++ FQA はゴミの山です。それを無視します。
に関しては、 の型も関数である引数を取ることを除いて、foo x(bar())
と同じくらいあいまいです。ここにポインタを追加すると、私が何を意味するかがわかります。foo x()
x
foo (*x)();
foo (*x)(bar(*)());
これを許可するという考えでさえばかげていますが、今は誰もそれを変えることはできません.
(私はこの文法が少しずれているのではないかとこっそり疑っていますが、誰かが私を訂正してくれると確信しています)。