<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod)]]></title><description><![CDATA[<p>Ist eigentlich definiert dass bei <code>reinterpret_cast&lt;char*&gt;(&amp;pod)</code> das selbe rauskommen muss wie bei <code>static_cast&lt;char*&gt;(static_cast&lt;void*&gt;(&amp;pod))</code> ?</p>
<p>Bzw. wenn nicht, welcher Weg ist vorzuziehen wenn man einen <code>char</code> -Zeiger für <code>memcpy</code> -artige Funktionen ala <code>send</code> bekommen möchte?<br />
( <code>memcpy</code> selbst nimmt ja einen <code>void*</code> Parameter, von daher stellt sich die Frage da nicht)</p>
<p>Ich persönlich verwende meist <code>reinterpret_cast</code> wenn ich Funktionen wie <code>send</code> direkt aufrufe.</p>
<p>Wenn ich allerdings Wrapper für Funktionen ala <code>send</code> oder <code>revc</code> schreibe (die ja einen <code>char*</code> als Parameter nehmen), gebe ich dem Wrapper eher einen <code>void*</code> Parameter. Das würde dann der <code>static_cast&lt;char*&gt;(static_cast&lt;void*&gt;(&amp;pod))</code> Variante entsprechen. Zuerst findet eine (meist implizite) Konvertierung nach <code>void*</code> statt, und dieser Zeiger wird dann innerhalb des Wrappers wieder (explizit) zu einem <code>char*</code> konvertiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266003/static_cast-lt-char-gt-static_cast-lt-void-gt-amp-pod-vs-reinterpret_cast-lt-char-gt-amp-pod</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 15:44:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266003.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 May 2010 15:21:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 15:23:34 GMT]]></title><description><![CDATA[<p>Ist eigentlich definiert dass bei <code>reinterpret_cast&lt;char*&gt;(&amp;pod)</code> das selbe rauskommen muss wie bei <code>static_cast&lt;char*&gt;(static_cast&lt;void*&gt;(&amp;pod))</code> ?</p>
<p>Bzw. wenn nicht, welcher Weg ist vorzuziehen wenn man einen <code>char</code> -Zeiger für <code>memcpy</code> -artige Funktionen ala <code>send</code> bekommen möchte?<br />
( <code>memcpy</code> selbst nimmt ja einen <code>void*</code> Parameter, von daher stellt sich die Frage da nicht)</p>
<p>Ich persönlich verwende meist <code>reinterpret_cast</code> wenn ich Funktionen wie <code>send</code> direkt aufrufe.</p>
<p>Wenn ich allerdings Wrapper für Funktionen ala <code>send</code> oder <code>revc</code> schreibe (die ja einen <code>char*</code> als Parameter nehmen), gebe ich dem Wrapper eher einen <code>void*</code> Parameter. Das würde dann der <code>static_cast&lt;char*&gt;(static_cast&lt;void*&gt;(&amp;pod))</code> Variante entsprechen. Zuerst findet eine (meist implizite) Konvertierung nach <code>void*</code> statt, und dieser Zeiger wird dann innerhalb des Wrappers wieder (explizit) zu einem <code>char*</code> konvertiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891368</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 02 May 2010 15:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 15:28:37 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn ich allerdings Wrapper für Funktionen ala <code>send</code> oder <code>revc</code> schreibe (die ja einen <code>char*</code> als Parameter nehmen), gebe ich dem Wrapper eher einen <code>void*</code> Parameter.</p>
</blockquote>
<p>Wie wärs mit Templates?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891372</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Sun, 02 May 2010 15:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 15:32:37 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn ich allerdings Wrapper für Funktionen ala <code>send</code> oder <code>revc</code> schreibe (die ja einen <code>char*</code> als Parameter nehmen), gebe ich dem Wrapper eher einen <code>void*</code> Parameter.</p>
</blockquote>
<p>Wie wärs mit Templates?</p>
</blockquote>
<p>Das geht komplett am Thema vorbei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891374</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 02 May 2010 15:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 16:09:42 GMT]]></title><description><![CDATA[<p>Na und? Du hast trotzdem nicht auf meine Frage reagiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891386</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Sun, 02 May 2010 16:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 16:22:50 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ist eigentlich definiert dass bei <code>reinterpret_cast&lt;char*&gt;(&amp;pod)</code> das selbe rauskommen muss wie bei <code>static_cast&lt;char*&gt;(static_cast&lt;void*&gt;(&amp;pod))</code> ?</p>
</blockquote>
<p>Ich weiß nicht. Kannst Du aber trotzdem sorgenlos benutzen. Wenn ich mich richtig erinnere, gab's dazu mal eine Diskussion in comp.lang.c++ oder comp.lang.c++.moderated und der Konsens war, dass das mit dem reinterpret_cast okay ist und dasselbe rauskommen müsste. Ich kann mir nicht vorstellen, was da schiefgehen kann.</p>
<p>Bei einem static_cast&lt;void*&gt;(&amp;pod) wird meines Wissens nach explizit gesagt, dass ein Zeiger herauskommt, der auf den &quot;Anfang&quot; des Objekts zeigt. Warum das bei reinterpret_cast&lt;char*&gt;(&amp;pod) bei einer noch so &quot;komischen&quot; Implementierung nicht gelten soll, leuchtet mir nicht ein.</p>
<p>Alternativ kann man (und sollte vielleicht auch) sich die Bytes per Hand zusammenbauen. Wenn es zB um das Lesen/Schreiben von Binärdaten geht, ist es so am einfachsten, ein plattformunabhängiges Format/Protokoll zu verwenden. Dazu verwende ich allerdings unsigned char und <code>reinterpret_cast</code> -e zwischen char* und unsigned char*.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891395</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 02 May 2010 16:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 16:35:47 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>Na und? Du hast trotzdem nicht auf meine Frage reagiert.</p>
</blockquote>
<p>Wieso sollte ich auf deine Frage reagieren wenn sie komplett am Thema vorbei geht?<br />
Ja, toll, machen wir einen Template-Overload.<br />
Bleibt immer noch die Frage wie ich aus dem <code>T*</code> im Template einen <code>char*</code> bekomme. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891404</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 02 May 2010 16:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 16:39:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>:<br />
Ja, das sind zwei verschiedene Probleme. Einmal wie man den Zeiger &quot;richtig&quot; castet, und dann wie man etwas plattformunabhängig in einen Byte-Stream serialisieren kann bzw. daraus de-serialisieren.</p>
<p>Mir geht es hier mal nur um das Casten des Zeigers. Und auch nicht darum was funktioniert (ich weiss dass beides funktioniert), sondern darum was der Standard sagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891405</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 02 May 2010 16:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Sun, 02 May 2010 23:32:22 GMT]]></title><description><![CDATA[<p>Also, ich habe mich damit mal auseinander gesetzt. Ich weiss nicht, ob ich wirklich bereits alles gefunden habe, aber vielleicht mal einen Ansatz.</p>
<p>Schauen wir uns zuerst <code>static_cast&lt;char*&gt;(static_cast&lt;void*&gt;(&amp;pod))</code> an. Nehmen wir das ganze mal in die einzelnen Schritte auseinander:</p>
<pre><code class="language-cpp">POD* pp = &amp;pod;                   // (1)
void* p = static_cast&lt;void*&gt;(pp); // (2)
char* c = static_cast&lt;char*&gt;(p);  // (3)
</code></pre>
<p>Nach 5.2.9 Absatz 2 können wir den Schritt (2) folgendermassen umschreiben:</p>
<pre><code class="language-cpp">POD* pp = &amp;pod;                   // (1)
void* p(pp);                      // (2)
char* c = static_cast&lt;char*&gt;(p);  // (3)
</code></pre>
<p>Gut. Schritt (1) ergibt einen Zeiger auf <code>POD</code> (5.3.1 Absatz 2). Ein Zeiger auf <code>POD</code> kann man in einen Zeiger auf <code>void</code> umwandeln und dabei zeigt der Zeiger auf <code>void</code> auf den Anfang des Speicherbereichs von <code>POD</code> (4.10 Absatz 2). Somit wäre auch Schritt (2) definiert. Schritt (3) wird interessant. Nach 5.2.9 Absatz 10 kann man einen Zeiger auf <code>void</code> per <code>static_cast</code> in einen Zeiger auf <code>char</code> umwandeln, sofern keine cv-Qualifizierung verloren geht. Das ist hier ja gegeben. Zudem steht in 3.9.2 Absatz 4, dass ein Zeiger auf <code>char</code> und ein Zeiger auf <code>void</code> die gleiche Repräsentation und Alignment haben. Somit nehme ich an, wenn ich das alles korrekt verstanden habe, dass <code>c</code> im Schritt (3) wirklich auf das erste Byte von <code>pod</code> zeigt.</p>
<p>Und nun kommt die Frage, wie es denn jetzt bei <code>reinterpret_cast</code> aussieht? Was passiert da? Wenn man das Kapitel 5.2.10 liest, dann steht da ziemlich oft &quot;implementation defined&quot; oder &quot;unspecified&quot;. Dieses Kapitel beschreibt das Verhalten von <code>reinterpret_cast</code> .</p>
<p>So wie ich dies lese, verstehe und interpretiere, gibt es keine Garantie vom Standard, dass die beiden Konvertierungen gleich sind. Vor allem weil die Konvertierung per <code>reinterpret_cast</code> schlicht und einfach &quot;implementation defined&quot; zu sein scheint.</p>
<p>Ich hoffe, dass dies jemand anderes nochmals prüft. Vielleicht findet camper etwas Zeit dafür <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891581</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 May 2010 23:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 09:34:24 GMT]]></title><description><![CDATA[<p>Es wird immer auf das erste Byte gezeigt, wenn man die Referenz einfach umcastet!<br />
Es wird einfach nur das Bytemuster &quot;anders&quot; interpretiert.</p>
<p>Angenommen &quot;pod&quot; befindet sich an Addresse 0xDEADBEEF, dann hat der Zeiger c nach &quot;char* c = reinterpret_cast&lt;char*&gt;(&amp;pod);&quot; auch 0xDEADBEEF in sich stehen.</p>
<p>Das ganze rumgetue mit static_casts finde ich hier unnötig, der Compiler bietet euch doch die Brechkeule namens reinterpret_cast an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891635</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Mon, 03 May 2010 09:34:24 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 09:43:45 GMT]]></title><description><![CDATA[<p>@Icematrix,<br />
Kannst du das auch beweisen? Womöglich mit dem C++ Standard? Kapitel, Absatz? Oder ist es einfach nur deine Vermutung?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891639</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 03 May 2010 09:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 11:40:54 GMT]]></title><description><![CDATA[<p>ISO/IEC 14882:2003 5.2.10 §7 schrieb:</p>
<blockquote>
<p>A pointer to an object can be explicitly converted to a pointer to an object of different type.</p>
<p>Except that converting an rvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 are no stricter than those of T1) and back to its original type<br />
yields the original pointer value, the result of such a pointer conversion is unspecified.</p>
</blockquote>
<p>Es geht also, es sei denn, T1 ist durch das Alignment nicht auf T2 abbildbar. Das gleiche Problem gibt es auch beim Umweg über <code>void*</code> (und zwar an der Stelle, an der void <code>void*</code> auf <code>T*</code> gecastet wird).<br />
Die Rückkonvertierung ist ebenfalls nicht spezifiziert, da POD* höchstwahrscheinlich strengere Alignment-Anforderungen hat als <code>char*</code><br />
Passt also.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891685</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 03 May 2010 11:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:01:56 GMT]]></title><description><![CDATA[<blockquote>
<p>@Icematrix,<br />
Kannst du das auch beweisen? Womöglich mit dem C++ Standard? Kapitel, Absatz? Oder ist es einfach nur deine Vermutung?</p>
<p>Grüssli</p>
</blockquote>
<p>Reine Logik, ich habe mehr mit dem Kompiliat eines C++-Compilers zu tun, also dem ASM-Code, als mit normalem C++-Code.</p>
<p>Ansonsten, das steht in jedem Lehrbuch, dass der reinterpret_cast einfach nur das Bytemuster neu interpretiert, um den Compiler zu Sachen zu zwingen, die seine Typsicherheit verbietet.</p>
<p>Im Endeffekt ist es total egal, ob eine Addresse in einem unsigned long oder in einem char* oder einem FooBarClass&amp; ist, für den Compiler sind das alles nur vorzeichenlose Integer, die groß genug sind, eine Speicheraddresse zu halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891729</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Mon, 03 May 2010 13:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:04:49 GMT]]></title><description><![CDATA[<p>Icematix schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Wenn man den Zeiger nach dem Cast noch benutzen will, ist das so falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891731</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 03 May 2010 13:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:25:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn man den Zeiger nach dem Cast noch benutzen will, ist das so falsch.</p>
</blockquote>
<p>Möchtest du genauer erläutern, wie du das meinst?<br />
Solange du auf ASM-Ebene &quot;legal&quot; bleibst, kannst du den C++-Compiler zu den ekligsten Sachen zwingen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891751</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Mon, 03 May 2010 13:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:26:27 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Es geht also, es sei denn, T1 ist durch das Alignment nicht auf T2 abbildbar.</p>
</blockquote>
<p>Wie du aus dem Abschnitt schliesst, dass es gehen soll, ist mir rätselhaft. Kannst du das mal näher erläutern und vielleicht übersetzen, wie du dies verstehst?</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Das gleiche Problem gibt es auch beim Umweg über <code>void*</code> (und zwar an der Stelle, an der void <code>void*</code> auf <code>T*</code> gecastet wird).</p>
</blockquote>
<p>Nein, da gibt es keine Probleme. Beim Cast von <code>void*</code> auf <code>T*</code> ist <code>T</code>  <code>char</code> . Und dafür gibt es eben: 3.9.2 Absatz 4.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21651">@Icematix</a>,<br />
Es geht hier aber darum, was der Standard sagt, und nicht was ein Kompiler liefert oder ein Lehrbuch sagt. Hustbaer interessiert sich für die Aussage dazu vom Standard:</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Mir geht es hier mal nur um das Casten des Zeigers. Und auch nicht darum was funktioniert (ich weiss dass beides funktioniert), sondern darum was der Standard sagt.</p>
</blockquote>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891752</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 03 May 2010 13:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:48:00 GMT]]></title><description><![CDATA[<p><em>Wegen Falschaussage selbst entfernt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891757</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 03 May 2010 13:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:44:52 GMT]]></title><description><![CDATA[<p>Diskussionen darüber was alles geht und was übliche Compiler wie machen interessieren mich hier gar nicht. Das weiss ich nämlich alles hübsch selbst.</p>
<p>Mich interessiert was der Standard vorschreibt.</p>
<p>Ich hätte mir auch gedacht dass das klar aus meinem Beitrag hervorgeht. Demzufolge halte ich einige Beiträge hier auch für ziemlich unpassend.</p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>ISO/IEC 14882:2003 5.2.10 §7 schrieb:</p>
<blockquote>
<p>A pointer to an object can be explicitly converted to a pointer to an object of different type.</p>
<p>Except that converting an rvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 are no stricter than those of T1) and back to its original type<br />
yields the original pointer value, the result of such a pointer conversion is unspecified.</p>
</blockquote>
<p>Es geht also, es sei denn, T1 ist durch das Alignment nicht auf T2 abbildbar. Das gleiche Problem gibt es auch beim Umweg über <code>void*</code> (und zwar an der Stelle, an der void <code>void*</code> auf <code>T*</code> gecastet wird).<br />
Die Rückkonvertierung ist ebenfalls nicht spezifiziert, da POD* höchstwahrscheinlich strengere Alignment-Anforderungen hat als <code>char*</code><br />
Passt also.</p>
</blockquote>
<p>In dem Absatz steht ganz was anderes. Lies ihn noch ein paar mal, vielleicht wird's dann klar.<br />
Da steht dass das Ergebnis der Konvertierung von T1 nach T2 &quot;unspecified&quot; ist.(Die Konvertierung selbst ist erlaubt, aber der Standard definiert hier nicht wie das Ergebnis auszusehen hat)</p>
<p>Lediglich wenn man wieder zurück-konvertiert, also T1 -&gt; T2 -&gt; T1, dann muss am Ende wieder das rauskommen mit dem man angefangen hat. Vorausgesetzt dass T2 keine &quot;strengeren&quot; Alignment-Vorgaben hat als T1.</p>
<p>Also genau andersrum. BTW: speziell dass man von void* wieder zu T zurückcasten darf, wenn der void* aus einem T* &quot;gewonnen&quot; wurde, sollte auch hinlänglich bekannt sein.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21651">@Icematix</a>:<br />
Auf Plattformen mit &quot;flacher&quot; Adressierung sind die meisten Dinge recht einfach, ja.<br />
Der Standard erlaubt allerdings durchaus Plattformen wo Zeiger auf verschiedene Typen unterschiedlich gross sind. Oder einfach nur unterschiedlich zusammengesetzt.<br />
Dort könnte ein reinterpret_cast dann gar nicht als &quot;Bitmuster anders interpretieren&quot; implementiert sein, da das Bitmuster in der Länge nicht passt.<br />
Tjo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891759</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 03 May 2010 13:44:52 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 13:46:32 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Du hast recht. Asche über mein Haupt. Irgendwie hat mich der eingeschobene Klammersetz durcheinander gebracht.<br />
Es ist erlaubt, aber unspezifiziert... Ich hasse den Standard.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891763</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 03 May 2010 13:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 14:10:37 GMT]]></title><description><![CDATA[<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21651">@Icematix</a>:<br />
Auf Plattformen mit &quot;flacher&quot; Adressierung sind die meisten Dinge recht einfach, ja.<br />
Der Standard erlaubt allerdings durchaus Plattformen wo Zeiger auf verschiedene Typen unterschiedlich gross sind. Oder einfach nur unterschiedlich zusammengesetzt.<br />
Dort könnte ein reinterpret_cast dann gar nicht als &quot;Bitmuster anders interpretieren&quot; implementiert sein, da das Bitmuster in der Länge nicht passt.<br />
Tjo.</p>
</blockquote>
<p>Dann benutz dafür den static_cast, wenn du eine intelligente Umwandlung brauchst?</p>
<p>Der reinterpret_cast macht seinen Dienst, wird dir eben nicht das korrekte Ergebnis liefern.<br />
So würde zb auf meiner x86-Kiste</p>
<pre><code class="language-cpp">unsigned int32 var32 = 0xABCDEF00;
unsigned int16 var16 = reinterpret_cast&lt;unsigned int16&gt;(var32);
</code></pre>
<p>var16 0x00EF enthalten während sie bei einem static_cast overflowen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891769</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Mon, 03 May 2010 14:10:37 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 16:02:13 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Du hast recht. Asche über mein Haupt. Irgendwie hat mich der eingeschobene Klammersetz durcheinander gebracht.<br />
Es ist erlaubt, aber unspezifiziert... Ich hasse den Standard.</p>
</blockquote>
<p>Naja, der Absatz ist auch eine Glanzleistung an &quot;unverständlich formuliert&quot;. Ich hab den Satz auch mehr als 2x lesen müssen um zu verstehen was das jetzt heissen soll. (Zumindest glaube ich dass ich es richtig verstanden habe :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891841</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 03 May 2010 16:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to static_cast&amp;lt;char*&amp;gt;(static_cast&amp;lt;void*&amp;gt;(&amp;amp;pod)) vs. reinterpret_cast&amp;lt;char*&amp;gt;(&amp;amp;pod) on Mon, 03 May 2010 17:27:03 GMT]]></title><description><![CDATA[<p>Icematix schrieb:</p>
<blockquote>
<p>Der reinterpret_cast macht seinen Dienst, wird dir eben nicht das korrekte Ergebnis liefern.<br />
So würde zb auf meiner x86-Kiste</p>
<pre><code class="language-cpp">unsigned int32 var32 = 0xABCDEF00;
unsigned int16 var16 = reinterpret_cast&lt;unsigned int16&gt;(var32);
</code></pre>
<p>var16 0x00EF enthalten während sie bei einem static_cast overflowen würde.</p>
</blockquote>
<p>Also mein Compiler weigert sich, das überhaupt zu kompilieren.</p>
<p>Ein Blick in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#658" rel="nofollow">Defining reinterpret_cast for pointer types</a> kann zur Klarstellung dienen.<br />
Im Übrigen bin ich der Ansicht, dass diese Änderung nicht notwendig ist, denn diese Klarstellung ist im Grunde schon in 5.2.10/10 angelegt (abgesehen vom Fall, das von oder zu cv void oder Nullpointer gecastet werden).</p>
<blockquote>
<p>An lvalue expression of type T1 can be cast to the type “reference to T2” if an expression of type “pointer to T1” can be explicitly converted to the type “pointer to T2” using a reinterpret_cast. That is, a reference cast reinterpret_cast&lt;T&amp;&gt;(x) has the same effect as the conversion *reinterpret_cast&lt;T*&gt;(&amp;x) with the built-in &amp; and * operators. The result is an lvalue that refers to the same object as the source lvalue, but with a different type. No temporary is created, no copy is made, and constructors (12.1) or conversion functions (12.3) are not called.67)</p>
</blockquote>
<p>In allen Fällen in denen wir einen denen wir einen dereferenzierbaren Zeiger haben, bestimmt dieser Abschnitt das Ergebnis sowohl eines Refernmz- als auch eine Pointercasts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1891885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1891885</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 03 May 2010 17:27:03 GMT</pubDate></item></channel></rss>