Przyczyną, widthktóra nie wydaje się być „lepka”, jest to, że pewne operacje wywołują .width(0)strumień wyjściowy. To są:
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]: Wszystkie do_putprzeciążenia num_putszablonu. Są one używane przez przeciążenia operator<<przyjmowania a basic_ostreami wbudowanego typu liczbowego.
22.2.6.2.2 [lib.locale.money.put.virtuals]: Wszystkie do_putprzeciążenia money_putszablonu.
27.6.2.5.4 [lib.ostream.inserters.character]: Przeciążenie związane z operator<<pobieraniem a basic_ostreami jednego typu char instancji basic_ostream lub char, signed charlub unsigned charlub wskaźniki do tablic tych typów char.
Szczerze mówiąc, nie jestem pewien, dlaczego tak jest, ale żadne inne stany nie ostreampowinny być resetowane przez sformatowane funkcje wyjściowe. Oczywiście takie rzeczy jak badbiti failbitmogą być ustawione, jeśli wystąpi błąd w działaniu wyjścia, ale należy się tego spodziewać.
Jedynym powodem, dla którego przychodzi mi do głowy, aby zresetować szerokość, jest to, że może być zaskakujące, jeśli podczas próby wyprowadzenia niektórych pól rozdzielanych ograniczniki zostały wypełnione.
Na przykład
std::cout << std::setw(6) << 4.5 << '|' << 3.6 << '\n';
" 4.5 | 3.6 \n"
Aby to „poprawić”, należałoby:
std::cout << std::setw(6) << 4.5 << std::setw(0) << '|' << std::setw(6) << 3.6 << std::setw(0) << '\n';
podczas gdy przy zerowaniu szerokości, pożądane wyjście można wygenerować z krótszymi:
std::cout << std::setw(6) << 4.5 << '|' << std::setw(6) << 3.6 << '\n';