不粘格式属性是如何复位?

问题描述 投票:1回答:1

考虑下面的代码:

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调用fillwidthoperator <<的状态,所以我常想,子系统内置于操作者的填充字符和宽度会泄漏话务员呼叫外,如果他们粘性能。

正如你所看到的,我不冲洗流,也不重新设置填充字符或宽度是这样,为什么(以及如何)原来的行为被保留?

所以,问题是:如何在ostream的属性,调用我operator<<class C后设置好的回到以前的状态?


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

c++ output output-formatting
1个回答
3
投票

作为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!!!!!!!!!

.

© www.soinside.com 2019 - 2024. All rights reserved.