Przyczyną, width
któ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_put
przeciążenia num_put
szablonu. Są one używane przez przeciążenia operator<<
przyjmowania a basic_ostream
i wbudowanego typu liczbowego.
22.2.6.2.2 [lib.locale.money.put.virtuals]: Wszystkie do_put
przeciążenia money_put
szablonu.
27.6.2.5.4 [lib.ostream.inserters.character]: Przeciążenie związane z operator<<
pobieraniem a basic_ostream
i jednego typu char instancji basic_ostream lub char
, signed char
lub unsigned char
lub wskaźniki do tablic tych typów char.
Szczerze mówiąc, nie jestem pewien, dlaczego tak jest, ale żadne inne stany nie ostream
powinny być resetowane przez sformatowane funkcje wyjściowe. Oczywiście takie rzeczy jak badbit
i failbit
mogą 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';