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<<
采用 abasic_ostream
和内置数字类型的重载使用。
22.2.6.2.2 [lib.locale.money.put.virtuals]:模板do_put
的所有重载。money_put
27.6.2.5.4 [lib.ostream.inserters.character]:采用 basic_ostream 实例化的 char 类型中的operator<<
a和其中之一的重载,或者,有符号的或或指向这些 char 类型的数组的指针。basic_ostream
char
char
unsigned char
老实说,我不确定这样做的理由,但是ostream
格式化的输出函数不应重置 an 的其他状态。当然,如果输出操作失败,可能会设置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';