<?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[const_cast Frage]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich frage mich gerade, warum folgende Konstruktion bei meinem Compiler nicht funktioniert:</p>
<pre><code>template&lt;typename T&gt;
const T* make_const( T* ptr )
{
   return const_cast&lt;T*&gt;( ptr );
}

template&lt;typename T&gt;
T* make_non_const( T* const ptr )
{
   return const_cast&lt;T*&gt;( ptr );
}

struct R
{
};

struct C
{
   R* find_r()
   {
      return NULL;
   }

   const R* find_r() const
   {
      return make_const( make_non_const( this )-&gt;find_r() ); 
   }
};

int main()
{
   const C theC;
   cont R* theC.find_r();
}
</code></pre>
<p>Der Plan ist, dass die const und non-const Methoden nur den Code der non-const Methode verwenden, indem der const-Aufruf zunächst in einen non-const this-Zeiger castet, dann die non-const Methode aufruft und das Ergbnis auf const castet. Aber bei meinem Compiler wird die non-const Methode nie aufgerufen, sondern immer wieder die const-Methode, bis das Programm in einen Stacküberlauf läuft.</p>
<p>Edit:<br />
Mit</p>
<pre><code>template&lt;typename T&gt;
T* make_non_const( const T* const ptr )
{
   return const_cast&lt;T*&gt;( ptr );
}
</code></pre>
<p>geht´s...</p>
<p>Ich bin davon ausgegangen, dass ein non-const Zeiger auf ein const Objekt gereicht hätte.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333514/const_cast-frage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 21:17:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333514.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Jul 2015 13:05:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const_cast Frage on Mon, 13 Jul 2015 13:09:27 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich frage mich gerade, warum folgende Konstruktion bei meinem Compiler nicht funktioniert:</p>
<pre><code>template&lt;typename T&gt;
const T* make_const( T* ptr )
{
   return const_cast&lt;T*&gt;( ptr );
}

template&lt;typename T&gt;
T* make_non_const( T* const ptr )
{
   return const_cast&lt;T*&gt;( ptr );
}

struct R
{
};

struct C
{
   R* find_r()
   {
      return NULL;
   }

   const R* find_r() const
   {
      return make_const( make_non_const( this )-&gt;find_r() ); 
   }
};

int main()
{
   const C theC;
   cont R* theC.find_r();
}
</code></pre>
<p>Der Plan ist, dass die const und non-const Methoden nur den Code der non-const Methode verwenden, indem der const-Aufruf zunächst in einen non-const this-Zeiger castet, dann die non-const Methode aufruft und das Ergbnis auf const castet. Aber bei meinem Compiler wird die non-const Methode nie aufgerufen, sondern immer wieder die const-Methode, bis das Programm in einen Stacküberlauf läuft.</p>
<p>Edit:<br />
Mit</p>
<pre><code>template&lt;typename T&gt;
T* make_non_const( const T* const ptr )
{
   return const_cast&lt;T*&gt;( ptr );
}
</code></pre>
<p>geht´s...</p>
<p>Ich bin davon ausgegangen, dass ein non-const Zeiger auf ein const Objekt gereicht hätte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2459586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2459586</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 13 Jul 2015 13:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to const_cast Frage on Mon, 13 Jul 2015 13:48:43 GMT]]></title><description><![CDATA[<pre><code>template&lt;typename T&gt; 
T* make_non_const( T* const ptr ) 
{ 
   return const_cast&lt;T*&gt;( ptr ); 
}
</code></pre>
<p>Der Typ des Parameters ist <em><strong>top-level</strong></em> <code>const</code> . Der Pointee-Typ des Zeigers ist im Rückgabetyp derselbe.</p>
<p>Richtig ist</p>
<pre><code>template&lt;typename T&gt; 
T* make_non_const( T const* ptr ) 
{ 
   return const_cast&lt;T*&gt;( ptr ); 
}
</code></pre>
<p>Es ist gleichermaßen richtig, wie du bereits selbst festgestellt hast, das <code>const</code> nach vorne zu packen:</p>
<pre><code>template&lt;typename T&gt; 
T* make_non_const( const T* ptr ) 
{ 
   return const_cast&lt;T*&gt;( ptr ); 
}
</code></pre>
<p>Das <code>const</code> nach dem Asterisk ist jedoch in jedem Fall überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2459588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2459588</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 13 Jul 2015 13:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to const_cast Frage on Wed, 15 Jul 2015 00:09:55 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Der Plan ist, dass die const und non-const Methoden nur den Code der non-const Methode verwenden,</p>
</blockquote>
<p>Das ist allerdings genau verkehrt herum. Wenn das Objekt, mit dem gearbeitet wird, tatsächlich const ist, und die non-const-Funktion tatsächlich Veränderungen durchführt, resultiert undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2459823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2459823</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 15 Jul 2015 00:09:55 GMT</pubDate></item></channel></rss>