Zunächst natürlich: der Zeiger wird garantiert in den ersten Fall ausgerichtet (von §5.3.4/10 und §3.7.4.1/2), und kann korrekt in beiden Fällen ausgerichtet werden. (Natürlich, wenn sizeof(int) == 1
, aber , auch wenn dies nicht der Fall ist, hat eine Implementierung nicht notwendigerweise Ausrichtungsanforderungen haben.)
Und die Dinge klar zu machen: Ihre Abgüsse alle reinterpret_cast
sind.
Darüber hinaus ist dies eine interessante Frage, denn bis kann ich sagen, gibt es keinen Unterschied in den beiden Casts, soweit der Standard betroffen ist. Die Ergebnisse der Umwandlung sind nicht spezifiziert (gemäß §5.2.10/7); Sie sind nicht einmal garantiert , dass die Umwandlung in eine char*
wird in den ursprünglichen Wert resultieren.(Es wird offensichtlich nicht zum Beispiel an Maschinen wo int*
kleiner als ein char*
.)
In der Praxis natürlich: Der Standard verlangt, dass die Rückkehr Wert von new char[N]
ausreichend für einen beliebigen Wert ausgerichtet werden die kann hineinpassen, so dass Sie garantiert sind in der Lage sein, zu tun:
intPtr = new (charPtr) int;
, die genau die gleiche Wirkung wie Ihr Stich hat angegeben, dass die Standardkonstruktors für int
ist ein no-op. (Und unter der Annahme, dass sizeof(int) <= 42
.) So ist es schwer, eine Implementierung vorstellen, in der der erste Teil fehlschlägt. Sie sollten in der Lage sein, die intPtr
genau wie alle anderen legal erhaltenen intPtr
zu verwenden. Und die Idee, dass die Umwandlung zurück in eine char*
würde irgendwie in einem anderen Wert von der ursprünglichen char*
scheint absurd ergeben.
Im zweiten Teil sind alle Wetten ab: Sie kann auf jeden Fall nicht dereferenzieren den Zeiger (es sei denn, Ihre Implementierung sonst garantiert), und es ist auch durchaus möglich, dass es wieder zu char*
Ergebnisse in etwas anderes zu konvertieren. (Stellen Sie sich ein Wort Maschine gerichtet, zum Beispiel, in dem bis eine char*
auf einen int*
Runden zu konvertieren. Dann Umwandlung in würde wieder ein char*
die sizeof(int)
höher als das Original war. Oder wo ein Versuch, einen falsch ausgerichteten Zeiger konvertieren immer Ergebnis in einem Null-Zeiger.)
Unausgeglichener Zugriff würde passieren (auf relevanten Prozessoren), wenn Sie danach versuchen, 'intPtr' zu verwenden. Also wäre es definitiv nicht akzeptabel. Obwohl es bei einigen Prozessoren funktionieren kann - z. x86 wird glücklich, wenn ein wenig langsamer, unausgerichteten Speicher lesen. –
Ich denke, du kannst zurückwerfen, aber nach der Besetzung nicht mehr verwenden :) Das müsste ich allerdings überprüfen. –
Was meinst du mit "Kannst du es zurückwerfen?" –