考虑下面的代码:
class C{};
std::ostream &operator <<(std::ostream &o, const C &) {
o.fill('!');
o.width(8);
return o << 42;
}
int main() {
std::cout << C{} << '\n';
std::cout << 42 << '\n';
return 0;
}
它输出:
!!!!!!42
42
我期待!!!!!!42
两次,因为我已经改变了提供std::ostream o
调用fill
内width
和operator <<
的状态,所以我常想,子系统内置于操作者的填充字符和宽度会泄漏话务员呼叫外,如果他们粘性能。
正如你所看到的,我不冲洗流,也不重新设置填充字符或宽度是这样,为什么(以及如何)原来的行为被保留?
所以,问题是:如何在ostream
的属性,调用我operator<<
为class C
后设置好的回到以前的状态?
这不会困扰我,我很高兴与这种行为,但我想了解它是如何工作的。
作为underscore_d提到:width
不黏腻。但实际上是iostream类及其操纵者没有这样的属性stickiness
。
不过,如果宽度就不会被以前的<<
操作员呼叫复位,宽度也会影响\n
的输出:
std::cout << std::setw(10) << std::setfill('!') << 42 << '\n';
std::cout << std::setw(10) << std::setfill('!') << 42 << std::setw(10) << '\n';
给
!!!!!!!!42
!!!!!!!!42!!!!!!!!!
.