序文
Google Style Guide には、前方宣言の欠点のリストが含まれています
前方宣言は依存関係を隠すことができるため、ユーザー コードはヘッダーが変更されたときに必要な再コンパイルをスキップできます。
前方宣言は、その後のライブラリの変更によって壊れる可能性があります。関数とテンプレートの前方宣言により、ヘッダーの所有者は、パラメーターの型の拡張、既定値を持つテンプレート パラメーターの追加、新しい名前空間への移行など、互換性のある変更を API に加えることができなくなります。
名前空間 std:: からシンボルを前方宣言すると、未定義の動作が発生します。
前方宣言または完全な #include が必要かどうかを判断するのは難しい場合があります。#include を前方宣言に置き換えると、コードの意味が暗黙のうちに変更される可能性があります。
コード:
// b.h:
struct B {};
struct D : B {};
// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); } // calls f(B*)
#include が B および D の前方宣言に置き換えられた場合、test() は f(void*) を呼び出します。
ヘッダーから複数のシンボルを前方宣言すると、単にヘッダーを #include するよりも冗長になる場合があります。
前方宣言を有効にするコードを構造化すると (たとえば、オブジェクト メンバーの代わりにポインター メンバーを使用する)、コードが遅くなり、より複雑になる可能性があります。
質問
ヘッダーが変更されたときに前方宣言が必要な再コンパイルをスキップする単一のシナリオを思いつくことができないため、最初の点に特に興味があります。これがどのように起こるか誰か教えてもらえますか? それとも、これはGoogleコードベースに固有のものですか?
これはリストの最初のポイントであるため、かなり重要と思われます。