Op donderdag 07 maart 2002 12:18 schreef Soultaker het volgende:
Een printf-functie heeft inderdaad geen tijdelijk object nodig. Als ik naar de standard output schrijf, zoals jij doet, kan ik gewoon printf("%f",0.1"); doen. Daar hoef ik niets voor te alloceren of instantiëren.
Wat is het verschil met
std::cout << 0.1? Wat alloceer ik meer?
Als ik de string op wil slaan, moet ik inderdaad ruimte alloceren voor de string. Maar dat moet jij dan ook nog doen! Jou stream object levert immers ook een nieuwe string op. In beide scenario's moet je dus een extra object alloceren.
Exact, het maakt dus in principe niets uit, er wordt een object meer geinstantieerd (de stringstream die als wrapper rond de buffer dient). Als je niet van het instantieeren van tijdelijke wrapper-objecten houdt, is OOP niet de juiste programmeertechniek, je kunt dan beter teruggaan naar structured programming...
Verder doen imho streamnotaties enigszins afbreuk aan de leesbaarheid van de code, omdat het steeds onduidelijk is met welke types er wordt gewerkt. Als het er niet direct boven had gestaan, had ik niet kunnen zien dat PI een float is, wat wel direct uit de format specifier blijkt.
Dit is dus juist een
enorm nadeel van de printf famillie, ze is niet typesafe! Verander je in je code van een float in een double maar vergeet de format-string aan te passen, dan levert printf garbage. De stream zal
nooit garbage leveren, hoogstens een compiler-error.
(Niet geheel volgens de standaard maar wel erg handig waarschuwt de GNU compiler als je andere argumenten in een format stopt dan je in je format string hebt aangekondigt).
Dat is dus een "evil hack"

om te proberen toch iets van typesafety in de printf familie te krijgen.