コンパイラによって通ったり通らなかったりするコードに困ってる。
C++の規格ではどっちが正しいのか教えてくれ。

std::ofstream fout;
std::ostream *pout = fout ? &fout : &std::cout;
std::ostream &out = fout ? fout : std::cout;

gcc3.4.4だと両方通る。
VC8だと上が通って下が通らない。エラーメッセージはこんなん。

エラー1error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ (クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスできません。c:\program files\microsoft visual studio 8\vc\include\ostream581

なぜかヘッダーにエラーがあることになってるんだけど、&outの行を
コメントアウトするとコンパイル通るからこの行のせいだと思うんだ。

C++の規格的にはどっちが正しい?