width「スティッキー」でないように見える理由は、特定の操作が.width(0)出力ストリームを呼び出すことが保証されているためです。それらは:
21.3.7.9 [lib.string.io]:
template<class charT, class traits, class Allocator>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os,
const basic_string<charT,traits,Allocator>& str);
22.2.2.2.2 [lib.facet.num.put.virtuals]:テンプレートのすべてのdo_putオーバーロードnum_put。これらはoperator<<、a basic_ostreamと組み込みの数値型のオーバーロードで使用されます。
22.2.6.2.2 [lib.locale.money.put.virtuals]:テンプレートのすべてのdo_putオーバーロードmoney_put。
27.6.2.5.4 [lib.ostream.inserters.character]:operator<<a を取得するオーバーロードbasic_ostreamと、basic_ostreamインスタンス化のcharタイプの1つまたはchar、signed charまたはunsigned charまたはこれらのchar型の配列へのまたはポインタを。
正直なところ、その根拠はわかりませんが、ostreamフォーマットされた出力関数によってリセットされる他の状態はありません。もちろん、次のようなものbadbitとfailbit出力動作中に障害が発生した場合に設定することができるが、それを期待しなければなりません。
幅をリセットするために私が考えることができる唯一の理由は、いくつかの区切られたフィールドを出力しようとしたときに、区切り文字が埋め込まれていたのは驚くべきことである。
例えば
std::cout << std::setw(6) << 4.5 << '|' << 3.6 << '\n';
" 4.5 | 3.6 \n"
これを「修正」するには、次のようにします。
std::cout << std::setw(6) << 4.5 << std::setw(0) << '|' << std::setw(6) << 3.6 << std::setw(0) << '\n';
一方、幅をリセットすると、短い方で目的の出力を生成できます。
std::cout << std::setw(6) << 4.5 << '|' << std::setw(6) << 3.6 << '\n';