これは、 Google の C++ コーディング ガイドラインからの抜粋です。
定義にアクセスせずにヘッダーファイルでクラス Foo を使用するにはどうすればよいですか?
- Foo* または Foo& 型のデータ メンバーを宣言できます。
- Foo 型の引数および/または戻り値を持つ関数を宣言できます (定義はできません)。(1 つの例外は、引数 Foo または const Foo& に非明示的な 1 つの引数のコンストラクターがある場合です。この場合、自動型変換をサポートするには完全な定義が必要です。)
- Foo 型の静的データ メンバーを宣言できます。これは、静的データ メンバーがクラス定義の外で定義されているためです。
私が気になるのは、2 番目の箇条書きの例外です。これはなぜですか?自動型変換をサポートしたいのに、なぜ完全な定義が必要なのですか?
私の推測では、暗黙的な変換で一時オブジェクトが作成されるため、コンパイラーは宛先タイプの完全な定義を必要としていると思います。私は正しく推測していますか?それ以上のことはありますか?
編集:
私が見ているように、ガイドラインの例外は次のような状況に対処しています:
class A
{
public:
A( int );
};
class B
{
public:
B( A const &a );
};
int main()
{
B b(2);
}
ここでは、ユーザー定義の暗黙的な変換 (int から A へ) が 1 つだけあり、const & を受け入れるコンストラクターを呼び出します。この例外で意味のある唯一のことは、たとえば int から A への直接変換をサポートし、次に A const & を受け入れるコンストラクターを介して B への直接変換をサポートすることです。これにより、A クラスが存在するヘッダー ファイルを明示的に含める必要なく、クライアント コードがこの変換チェーンを使用できるようになります。宣言した。