<?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[Frage zu const_cast]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Verstaendnisproblem bei folgenden Zeilen (Quelle: Thinking in C++, Bruce Eckel):</p>
<pre><code>[cpp]const int i = 10;
int* j = const_cast&lt;int*&gt;(&amp;i)
[/cpp]
</code></pre>
<p>Es heisst, nur so koenne man von const nach nonconst casten. Nur, was ist denn hier nonconst? j zeigt doch lediglich auf die Adresse der Konstanten und genau da kann man doch nichts aendern?! Was kann man also damit anfangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305127/frage-zu-const_cast</link><generator>RSS for Node</generator><lastBuildDate>Sat, 27 Jun 2026 02:16:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305127.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Jun 2012 16:24:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 16:24:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Verstaendnisproblem bei folgenden Zeilen (Quelle: Thinking in C++, Bruce Eckel):</p>
<pre><code>[cpp]const int i = 10;
int* j = const_cast&lt;int*&gt;(&amp;i)
[/cpp]
</code></pre>
<p>Es heisst, nur so koenne man von const nach nonconst casten. Nur, was ist denn hier nonconst? j zeigt doch lediglich auf die Adresse der Konstanten und genau da kann man doch nichts aendern?! Was kann man also damit anfangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225881</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Thu, 21 Jun 2012 16:24:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 16:27:41 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>genau da kann man doch nichts aendern?!</p>
</blockquote>
<pre><code class="language-cpp">const int i = 10;
int* j = const_cast&lt;int*&gt;(&amp;i);

i = 5; // Compiler Fehler

const int* p = &amp;i;
*p = 5; // Compiler Fehler

*j = 5; // Wird wohl abstürzen, kompiliert aber anstandslos.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2225882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225882</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 21 Jun 2012 16:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 16:59:24 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<pre><code>[cpp]const int i = 10;
int* j = const_cast&lt;int*&gt;(&amp;i)
[/cpp]
</code></pre>
<p>Es heisst, nur so koenne man von const nach nonconst casten. Nur, was ist denn hier nonconst? j zeigt doch lediglich auf die Adresse der Konstanten und genau da kann man doch nichts aendern?! Was kann man also damit anfangen?</p>
</blockquote>
<p>Nein, <code>j</code> ist ein Zeiger auf ein <code>int</code> . Die Tatsache, dass der Pointee eigentlich const ist, davon weiß <code>j</code> nichts (für <code>j</code> ist <code>i</code> also non-const). Solltest du versuchen, dem Pointee etwas zuzuweisen, landest du bei undefiniertem Verhalten.</p>
<p>Die Kenntniss zu haben, dass es so etwas gibt, ist ok, machen solltest du das aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225883</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 21 Jun 2012 16:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 16:34:07 GMT]]></title><description><![CDATA[<p>Den const_cast benutzt du ja auch normal nicht, sondern in der Praxis eigentlich nur:<br />
a) um Programmierfehler (fehlende const-correctness) anderer auszugleichen. Kommt hauptsächlich vor, um C-Routinen, die fälschlicherweise einen char* erwarten, einen const char* reinzudrücken.<br />
b) um gewisse const/non-const-Überladungen nicht doppelt schreiben zu müssen.<br />
c) um volatile zu entfernen, wofür dann auch wieder a) und b) gelten</p>
<p>In dem Beispiel wäre es fatal, über i zu versuchen, das j zu ändern, es demonstriert bloß die Syntax eines const_cast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225885</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 21 Jun 2012 16:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 17:37:39 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Den const_cast benutzt du ja auch normal nicht, sondern in der Praxis eigentlich nur:<br />
a) um Programmierfehler (fehlende const-correctness) anderer auszugleichen. Kommt hauptsächlich vor, um C-Routinen, die fälschlicherweise einen char* erwarten, einen const char* reinzudrücken.<br />
b) um gewisse const/non-const-Überladungen nicht doppelt schreiben zu müssen</p>
</blockquote>
<p>Danke erstmal allen fuer die Antworten. Hast Du fuer a) und b) je ein Beispiel? Bei a) ist mir nicht klar, was Du meinst, wenn andere Programmierfehler machen, sind die doch schon drin, man wuerde doch sowieso korrigieren, was auch ohne const_cast funktionieren wuerde, oder etwa nicht!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225913</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Thu, 21 Jun 2012 17:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 17:45:17 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>man wuerde doch sowieso korrigieren, was auch ohne const_cast funktionieren wuerde, oder etwa nicht!?</p>
</blockquote>
<p>Das wäre toll, aber manchmal hast du nicht die Möglichkeit das zu korrigieren. z.B. weil es eine externe Bibliothek ist oder Ähnliches.</p>
<p>Zu 2)</p>
<pre><code class="language-cpp">struct xyz
{
  int&amp; get()
  {
    ...;
    return ...;
  }

  const int&amp; get() const
  {
    return const_cast&lt;xyz*&gt;(this)-&gt;get();
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2225919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225919</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 21 Jun 2012 17:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 17:55:56 GMT]]></title><description><![CDATA[<p>Genau falschrum cooky.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225928</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 21 Jun 2012 17:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 17:57:58 GMT]]></title><description><![CDATA[<p>Beispiel zu b:</p>
<pre><code class="language-cpp">const int* kompliziert(const int* i) { /* kompliziertes Zeug auf i, aber nicht auf *i */ return i;}

int* kompliziert(int* i) {/* Wie die const-Version aufrufen, um den Code nicht zu wiederholen? So: */ return const_cast&lt;int*&gt;(kompliziert(const_cast&lt;const int*&gt;(i)));}
</code></pre>
<p>Oder auch umgekehrt, wenn man sich ganz sicher ist, dass die non-const-Version den Pointee nicht verändert. Dann hat man jedoch keine Garantien vom Compiler für die Richtigkeit.</p>
<p>Kommt selten vor.</p>
<p>edit: Zu spät. Andersrum wie cooky kann man es auch machen, wie ich schon erwähnt habe. Dann ist man eben selber verantwortlich, dafür ist der Code etwas kürzer, weil man nur einen Cast braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225930</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 21 Jun 2012 17:57:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 18:40:57 GMT]]></title><description><![CDATA[<p>Danke fuer die Antworten. Was ich jedoch nicht verstehe, was Ihr mit 'umgekehrt' meint?! Wieso ist Seppj's Code 'umgekehrt dem von 'Cookie' ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225949</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Thu, 21 Jun 2012 18:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 18:43:51 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Danke fuer die Antworten. Was ich jedoch nicht verstehe, was Ihr mit 'umgekehrt' meint?! Wieso ist Seppj's Code 'umgekehrt dem von 'Cookie' ?</p>
</blockquote>
<pre><code class="language-cpp">int* kompliziert(int* i) { /* kompliziertes Zeug auf i, aber nicht auf *i */ return i;}

const int* kompliziert(const int* i) {/* Wie die non-const-Version aufrufen, um den Code nicht zu wiederholen? So: */ return kompliziert(const_cast&lt;int*&gt;(i));}
</code></pre>
<p>Aber dann sollte man lieber sicher sein, dass das auch wirklich richtig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225954</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 21 Jun 2012 18:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 19:16:55 GMT]]></title><description><![CDATA[<p>Danke Seppj. Jedoch, die Frage war, was zwischen Deinem und Cookie's Code 'umgekehrt' ist. Mir faellt es ausserdem etwas schwer, den code zuzuordnen. Um was handelt es sich genau, um angepassten Code, der von 'falsch programmiertem' externen code aufgerufen wird oder umgekehrt? Wo wird denn wann was aufgerufen, und was war/ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225969</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Thu, 21 Jun 2012 19:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 19:22:45 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Genau falschrum cooky.</p>
</blockquote>
<p>Andererseits versteh ich das nicht, für sowas gibt es doch <code>mutable</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225971</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 21 Jun 2012 19:22:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 19:27:00 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Andererseits versteh ich das nicht, für sowas gibt es doch <code>mutable</code> .</p>
</blockquote>
<p>Falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225974</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 21 Jun 2012 19:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 19:34:38 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Danke Seppj. Jedoch, die Frage war, was zwischen Deinem und Cookie's Code 'umgekehrt' ist. Mir faellt es ausserdem etwas schwer, den code zuzuordnen. Um was handelt es sich genau, um angepassten Code, der von 'falsch programmiertem' externen code aufgerufen wird oder umgekehrt? Wo wird denn wann was aufgerufen, und was war/ist falsch?</p>
</blockquote>
<p>Das war ein Beispiel zu meinem Punkt b, wie man in manchen Fällen Codeduplizierung sparen kann, nicht zum Aufruf von falschem externen Code. Man kann mit dem const_cast sowohl von der const-Variante aus die non-const aufrufen als auch umgekehrt. Das war das &quot;umgekehrt&quot; von dem wir gesprochen haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225978</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 21 Jun 2012 19:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu const_cast on Thu, 21 Jun 2012 20:40:49 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das war ein Beispiel zu meinem Punkt b, wie man in manchen Fällen Codeduplizierung sparen kann, nicht zum Aufruf von falschem externen Code. Man kann mit dem const_cast sowohl von der const-Variante aus die non-const aufrufen als auch umgekehrt. Das war das &quot;umgekehrt&quot; von dem wir gesprochen haben.</p>
</blockquote>
<p>Alles klar, danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225993</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Thu, 21 Jun 2012 20:40:49 GMT</pubDate></item></channel></rss>