如何重置非粘性格式属性



考虑以下代码:

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 <<内部调用fillwidth所提供的std::ostream o的状态,所以我曾经认为填充字符和设置到操作符中的宽度将泄漏在操作符调用之外,就好像它们是粘性属性一样。

正如你所看到的,我没有刷新流,也没有重新设置填充字符或宽度,为什么(以及如何)原始行为被保留?

所以问题是:ostream的属性如何在调用class Coperator<<后设置回以前的状态?


这并不困扰我,我很高兴这种行为,但我想了解它是如何工作的

正如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!!!!!!!!!

.

相关内容

  • 没有找到相关文章

最新更新