VC++7.1 の標準ライブラリに規格違反めっけ.規格では std::codecvt::length, std::codecvt::do_length のシグネチャは各々以下のように要求されている.
int codecvt::length(state_type &, extern_type from, extern_type from_end, size_t max); virtual int codecvt::do_length(state_type &, extern_type from, extern_type from_end, size_t max);
けれど,VC++7.1 に付いてきてるヤツは第1引数が const 参照になってる.
int codecvt::length(state_type const &, extern_type from, extern_type from_end, size_t max); virtual int codecvt::do_length(state_type const &, extern_type from, extern_type from_end, size_t max);
これじゃいくら派生クラスで非 const 参照引数で do_length オーバーライドしても呼ばれないっちゅーねん.
const 参照にしてしまっている気持ちも分からなくはないけれど,規格の文言は明らかに "The effect on the state argument is “as if” it called do_in 〜" と state_type の引数に副作用がある可能性を示唆しているしなー.
とりあえず const_cast で対応.