class A
{
class C;
class B
{
public:
class B(C& r) { int i = r.i; }
};
class C
{
public:
int i;
};
};

A::BのコンストラクタはCの完全な宣言が必要なはずなのにコンパイルが通ってしまいます。(VC++6)
このB, CをAの外に出すとCが認識できない型とエラーになります。
この振る舞いは言語規格として正しいのでしょうか?