char_traitsとcodecvt

char_traitsとcodecvtの関係がよく分からなくなってきました。
これらは共にstate_typeという型を持ちます。規格によると、codecvtのstate_typeはエンコーディングの種類ごとに別々の型を用いるはずですが、ストリームは特定のchar_traitsを持っているのでstate_typeも固定、つまりエンコーディングも固定ということになります。
では、なぜcodecvtなんてものがあるのでしょう?char_traitsにワイド/ナロー変換関数があれば良い気がします。
Boostのutf8_codecvt_facetを見てみると、state_typeはmbstate_tで、そもそもstate_typeを全く使っていません。
もしかして、state_typeは想定する各エンコーディングの状態型のunionみたいなものなのかもしれません。他のソースも当たってみます。

#VC8だとmbstate_tはintで、標準のファセットもmbstate_tの変数は使ってないみたいです。シフト状態を記憶するだけなのかも。