numpunctの補足
numpunctは規格の英文読み違えてました。
debug_numpunct::do_grouping()で64ビット整数用に20グループ分一桁の指定をしていましたが、
最後のグループより後ろは最後の指定に従うため、
std::string do_grouping() const // virtual { return "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"; }
でなく、
std::string do_grouping() const // virtual { return "\1"; }
としておけばOKでした。
このぐらいの長さであれば、現在主流の短文字列最適化されたstringではコピーの負荷も少なくて済みますね。
ちなみにstd::numpunctでは、
std::string do_grouping() const // virtual { return ""; }
で区切りなしの指定になっています。