const tiefgestellte Operatoren von STL
Containern können einen Verweis auf const zurückgeben, da sie Aufrufe mit Indizes, die nicht im Container vorhanden sind, nicht verarbeiten können. Das Verhalten ist in diesem Fall nicht definiert. Folglich stellt std::map
als eine kluge Entwurfsauswahl nicht einmal eine konstante Operatorüberladung im tiefgestellten Index bereit.
QMap versucht ein wenig entgegenkommender zu sein, liefert eine konstante Subscript-Operatorüberladung als syntaktischen Zucker, läuft auf das Problem mit nicht existierenden Schlüsseln, versucht wieder entgegenkommender zu sein und gibt stattdessen einen standardkonstruierten Wert zurück.
Wenn Sie die Const-Referenzkonvention von STL beibehalten möchten, müssen Sie einen statischen Wert zuweisen und einen Verweis auf ,, zurückgeben. Dies würde jedoch im Widerspruch zu den Wiedereintrittsgarantien stehen, die QMap
bietet, so dass die einzige Möglichkeit darin besteht, nach Wert zurückzukehren. Die const
gibt es nur Zuckerbeschichtung, um einige dumme Fehler wie constmap["foo"]++
von kompilieren zu verhindern.
Das gesagt, die Rückkehr durch Referenz ist nicht immer der effizienteste Weg. Wenn Sie einen fundamentalen Typ zurückgeben, oder mit einer aggressiveren Optimierung, wenn sizeof(T)<=sizeof(void*)
, gibt Return-by-Wert oft den Compiler das Ergebnis in einem Register direkt anstelle von indirekt zurück (Adresse, um in Register zu führen) oder - Himmel verboten - auf der Stapel. Der andere Grund (abgesehen von der vorzeitigen Pessimierung), das Vorübergehen-Referenzverfahren, Slicing, zu bevorzugen, gilt hier nicht, da sowohl std::map
als auch QMap
wertebasiert und daher homogen sind.Für einen heterogenen Container müssen Sie Zeiger halten, und Zeiger sind grundlegende Typen (mit Ausnahme von intelligenten natürlich).
Das alles gesagt, ich benutze fast nie den Const Index-Operator in Qt. Ja, es hat schönere Syntax als find()
+ *it
, aber immer, werden Sie mit count()
/ Anrufen direkt vor dem konst Index-Operator am Ende, was bedeutet, dass Sie zweimal die binäre Suche tun. Und dann Sie nicht ohnehin die winzigen Unterschiede in Rückgabewert Leistung feststellen :)
Für value() const
, aber ich stimme, dass es Verweis auf const zurückkehren sollte, säumige auf den Referenz-to-Default-Wert als zweites Argument, aber ich denke, dass die Qt-Entwickler das für zu magisch hielten.
Mögliche Duplikat [Warum QMap :: operator \ [\] (const Key & key) Rückkehr nach Wert ?] (https://stackoverflow.com/questions/18503700/why-does-qmapoperatorconst-key-key-return-by-value) –
@ThomasKlier sicher, nur gefragt, 5 Jahre zuvor – MadH