Ich persönlich bin nicht wirklich ein Fan von Typedefs bei Containern.
typdefs machen sinn, wenn:
a: man datentypen an zentraler stelle pflegen will, also man schnell mal eben nen datentyp durch nen anderen kompatiblen datentyp ersetzen will ...
b: sich beim schreiben von typen ned die finger brechen will !!!
Denk mal grad im Umgang mit maps und anderen Templates ist Punkt b durchaus gegeben ...
Arbeit mal viel mit iteratoren und und weitern abhangigen Subtypen, dann iss std::map<int,int>::const_iterator zu MapT::const_iterator scho ne arge vereinfachung. Und das blaeht sich oft noch viel mehr auf ... hab mal als Key nen pair oder sowas ^^
Mann sollt natuerlich die Namen der typdefs auch irgendwie sinnig waehlen !
QMap<QString, QString> &value müsste im Grunde gehen, ich bin mir da aber bei Qt gar nicht mehr so sicher.
Warum nicht ???
Das impliziete sharen entbindet dich nicht von der logic, die du selber implementieren musst. Die referenz an der stelle ist der einzig richtige Weg !
Was passiert beim implizierten sharen ?
von values wird eine Kopie erzeugt, sprich ein neues object aufn stack aungelegt, desen (dynamische)daten aber auf die gleichen Daten wie bei value zeigen (shared), oder NULL, wenn in value eh nix drinne stand ....
in der funktion selber beschreibst aber das object ... sprich sobald du schon einen nichtkonstanten zugriff wie [] oder so auf das object macht, wird es geteilt, sprich spaetestens hier wird die kopie gemacht, und dein object und value zeigen nimmer auf die selben daten ....
Lass dich ned verwirren, an der Logic aendert sich nix durch das impliziete sharen ...
Probleme mit implizien sharen bekommst du generell nur, wenn dich indirekt intressiert, wo die daten liegen.
Das ist bei folgenden Themen der fall:
Du gibst konstante Pointer auf beinhaltende daten raus:
bei implizieten sharen , und beim aufloesen des shares weisst du nicht, welches stack-object den zeiger auf das neukopierte bekommt, und welches die ursprünglichen daten behaelt. das heisst schlimmstenfalls, machst du nen schreiboperation auf das andere Object mit dem daten sharest, und bei dir aendert sich intern der pointer auf die daten, was du aber gar ned mitbekommst
Laufzeitverhalten:
Du weisst nimmer genau, wann wirklich kopiert wird. Oftmals verlagert man kopieroperationen bewusst an zeitpunkte, wo es nicht weh tut ... das impliziete sharen kann dir dass unmöglich machen ....
multithreading generell:
du musst daten schuetzen damit sich schreib und lesezugriffe ned in die quere kommen. Aber wie, wenn du selbst ned entscheidest, bzw weisst, wann ne kopie gemacht wird und wann ned.
Fazit:
Wenn obige Themen anstehen, meide impliziet shared Objecte.
Bei der QT ist dies nur fuer alle nicht QObject abgeleiteten klassen relevant. Also meistens Container (untypisiert wie QMap, typisiert wie QString, QPixmap) .... nimm die stl und rohdaten fuer.
Alles was mit QObject zu tun hat, weisst du eh nie wanns geloescht wird ... und sind meistens GUI relevant, also dürfen per definition im Hauptthread verwendet werden.
fuer 90% der User wird dass aber nie der Fall sein. Man sollt nur wissen, wann es zu Problemen kommen kann ...
Ciao ...