Casting von string nach void* und wieder zurück
möglich ist, zu re-map der STL-Klasse-Objekt von void* ?
#include <string>
void func(void *d)
{
std::string &s = reinterpret_cast<std::string&>(d);
}
int main()
{
std::string s = "Hi";
func(reinterpret_cast<void*>(&s));
}
Funktioniert dein code funktioniert?
Warum wollen Sie dies tun? Welchen möglichen Grund Sie haben zu wollen
Viele falsche code angezeigt wird, um zu "arbeiten". Sie sollte test-code für compiler und andere Fehler, aber kein Fehler bedeutet nicht, kein problem.
Im eigentlichen code
Sie sind Missverständnis mindestens zwei Dinge: 1) Provisorien erstellt bei Aufruf der Funktion werden nicht zerstört, bis nach kehrt die Funktion zurück, und 2) Sie können nur verlängern die Lebensdauer eines vorübergehenden durch binden an eine Referenz sofort, wenn es erstellt wird, nicht, indem Sie es um und später Bindung.
Warum wollen Sie dies tun? Welchen möglichen Grund Sie haben zu wollen
reinterpret_cast
zu void*
? (Für was es Wert ist, die Umwandlung void*
implizit ist und kein cast notwendig ist. Beim Gießen zurück static_cast
ist ausreichend.)Viele falsche code angezeigt wird, um zu "arbeiten". Sie sollte test-code für compiler und andere Fehler, aber kein Fehler bedeutet nicht, kein problem.
Im eigentlichen code
string s
ist temporär, die zerstört wird, sobald es übergeben wird durch die func. Ich war auf der Suche nach binden einen Verweis auf die temporäre variable, die übergeben wird, durch eine void*
.Sie sind Missverständnis mindestens zwei Dinge: 1) Provisorien erstellt bei Aufruf der Funktion werden nicht zerstört, bis nach kehrt die Funktion zurück, und 2) Sie können nur verlängern die Lebensdauer eines vorübergehenden durch binden an eine Referenz sofort, wenn es erstellt wird, nicht, indem Sie es um und später Bindung.
InformationsquelleAutor user963241 | 2011-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Static_cast verwenden, um zu konvertieren void-Pointer zurück, um andere Hinweise, nur sicher sein, Sie zu konvertieren zurück auf die gleiche Art ursprünglich verwendet haben. Kein cast ist notwendig, um zu konvertieren, um ein void-Zeiger.
Dies funktioniert für jeden Zeiger-Typ, einschließlich Zeiger auf Typen aus der stdlib. (Technisch gesehen alle Zeiger auf Objekt geben, aber das ist, was gemeint ist mit "Pointer"; andere Typen von Zeigern, wie Zeiger auf die Daten der Mitglieder, verlangen der Qualifikation.)
InformationsquelleAutor Fred Nurk
Ich wieder schrieb, wie folgende,
InformationsquelleAutor user963241
Du code sollte nicht kompilieren.
Ändern
zu
BEARBEITEN:
Aktualisierten code. Verwenden
static_cast
stattreinterpret_cast
Ja, du hast Recht.
static_cast
ist genug, da wir viel mitvoid *
... und da Sie schon dabei sind, machen, dass eine
static_cast
wird die diagnose der Fehler das nächste mal.InformationsquelleAutor DReJ
Ja, es ist möglich, aber Sie versuchen, Stimmen aus einem Zeiger auf
void *
dann ein Referenz. Diereinterpret_cast
Betreiber erlaubt nur das casting wieder auf genau die gleiche Art, die Sie angefangen haben. Versuchen Sie dies:static_cast
würde die Arbeit hier auch. Ich denke, dein code ist besser als OP ist genau, weil es nicht erfordernreinterpret_cast
, so dass Sie lieber nehmen advatage!InformationsquelleAutor Marcelo Cantos