Eigentlich dachte ich ne Referenz is mehr oder weniger ein Name für eine bestimmte Adresse (im Gegensatz zum Pointer der ja selbst eine hat) aber dann dürfte ich ja einer Referenz rein theopraktisch nix mehr zuweisen dürfen...
Stell Dir ne Referenz einfach als fertig dereferenzierter
konstanter Zeiger vor ! Nach der initialisierung kannst ihm nix mehr zuweisen.
der Adressoperator bringt natuerlich die einzigste, also die adresse der wirklichen daten zurueck ...
Weil die Entwickler der anderen Libraries -provokant gesagt- zu faul sind
Die Bloedeste Begründung die ich jemals gehoert hab

Sorry !
(btw, eine bekannte STL Implementierung namens "Dinkumware" haben implizietes cow verwendet und waren deshalb als "eigensinnig und inkompatibel" verschrien ^^ und man ist wieder zurueck.
sogar die libstdc++ (gnu) verwendete dies, tuts aber auch nimmer. Vielleicht hilft das hier:
http://www.open-std.org/jtc1/sc22/wg21/ ... n2647.html )
Code: Alles auswählen
#include <QtCore/QCoreApplication>
#include <QByteArray>
#include <iostream>
int main(int argc, char *argv[])
{
QByteArray strTest2;
const char * pData = NULL;
{
QByteArray strTest1 = "Moni";
strTest2 = strTest1;
pData = strTest2.constData();
char * pData = strTest2.data();
}
std::cout << strTest2;
std::cout << pData;
int i = 0;
}
was passiert hier wohl ?
Im Standard mit der STL mit std::string ist genau das verhalten genau definiert !
std::cout << strTest2;
std::cout << pData;
muessen beide "Moni" auf die Konsole schreiben !
Ok, Trolltech tut sich da leichter, die sind ned an den standard gebunden.
Schaun wir in die dokumentation:
QByteArray & QByteArray::operator= ( const QByteArray & other )
Assigns other to this byte array and returns a reference to this byte array.
ok, da passiert nichts boeses !
Returns a pointer to the data stored in the byte array. The pointer can be used to access the bytes that compose the array. The data is '\0'-terminated. The pointer remains valid as long as the byte array isn't reallocated or destroyed.
This function is mostly useful to pass a byte array to a function that accepts a const char *.
Note: A QByteArray can store any byte values including '\0's, but most functions that take char * arguments assume that the data ends at the first '\0' they encounter.
See also data() and operator[]().
ok, unser strTest2 sollte nicht zerstoert wurden sein und reallociert haben wir eigentlich auch nix ....
Bleibt die grosse Frage, warum ???
Jeder der die Problematik und die Technik kennt, weiss:
char * pData = strTest2.data();
war der Killer !
dazu in der Doku nur nen lapidarer hinweiss:
For read-only access, constData() is faster because it never causes a deep copy to occur.
Und das ist nur nen recht ueberschaubares Beispiel. In der Praxis iss das alles viel komplexer !
Stell dir mal vor, du musst strings / daten mit Mutexen sichern ... und die dinger arbeiten mit internen cow ohne das was davon weisst?
Ein horrorszenario ! (dies Besipiel ist nicht der Grund, warum die STL Impls z.b. wieder zurueckrudern auf nicht cow, sondern die Begründung, warum der anwender wissen muss, ob cow verwendet wird oder ned.)
Cow ist mit dem Wissen beherschbar und ne gaengige technik, im multithreading einsatz sehr komplex und alles andere als:
dem Anwender der Library kann das total egal sein..
Ciao ....