この質問に対するいくつかの回答を読んだとき、コンパイラが最初に関数に遭遇したときに、なぜ実際に関数について知る必要があるのか疑問に思い始めました。内部で宣言されたすべてのシンボルを収集するコンパイルユニットを解析するときに、パスを追加するだけで、宣言および使用される順序が重要でなくなるのは簡単ではないでしょうか。
関数を使用する前に宣言するのは確かに良いスタイルであると主張する人もいるかもしれませんが、C ++でこれが必須である理由は他にあるのでしょうか?
編集-説明する例:ヘッダーファイルでインラインで定義されている関数が必要だとします。これらの2つの関数は、相互に呼び出します(おそらく、ツリーの奇数層と偶数層が異なる方法で処理される再帰的なツリー走査)。これを解決する唯一の方法は、一方の関数をもう一方の関数の前に前方宣言することです。
より一般的な例(関数ではなくクラスを使用)は、private
コンストラクターとファクトリを使用するクラスの場合です。ファクトリは、そのインスタンスを作成するためにクラスを知る必要があり、クラスはfriend
宣言のためにファクトリを知る必要があります。
これが昔からの要件である場合、なぜある時点で削除されなかったのですか?既存のコードを壊すことはありませんね。