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';