考虑以下代码:
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
两次,因为我已经改变了operator <<
内部调用fill
和width
所提供的std::ostream o
的状态,所以我曾经认为填充字符和设置到操作符中的宽度将泄漏在操作符调用之外,就好像它们是粘性属性一样。
正如你所看到的,我没有刷新流,也没有重新设置填充字符或宽度,为什么(以及如何)原始行为被保留?
所以问题是:ostream
的属性如何在调用class C
的operator<<
后设置回以前的状态?
这并不困扰我,我很高兴这种行为,但我想了解它是如何工作的
正如underscore_d所提到的:width
不具有粘性。但是对于iostream类和它们的操作符来说,实际上没有stickiness
这个属性。
但是,如果前面的<<
操作符调用没有重置width,那么width也会影响n
的输出:
std::cout << std::setw(10) << std::setfill('!') << 42 << 'n';
std::cout << std::setw(10) << std::setfill('!') << 42 << std::setw(10) << 'n';
为
!!!!!!!!42
!!!!!!!!42!!!!!!!!!
.