<?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 wegcasten funtioniert nicht]]></title><description><![CDATA[<p>Hi, ich möchte in folgender Funktion das const von T* value wegcasten? Blöderweise funktioniert das nicht. Jemand Ideen?</p>
<pre><code>template &lt;class T&gt;
void MyClass&lt;T&gt;::AcceptOwner(const T* value) const
{
	const Base* obj = dynamic_cast&lt;const Base*&gt;(value);
	if (obj)
	{
		Base* obj2 = const_cast&lt;Base*&gt;(obj);
		if (obj2)
		{
			obj2-&gt;ReferenceCounter(_counter);
		}
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/324416/const-wegcasten-funtioniert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 16:19:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324416.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 Mar 2014 17:35:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 17:35:12 GMT]]></title><description><![CDATA[<p>Hi, ich möchte in folgender Funktion das const von T* value wegcasten? Blöderweise funktioniert das nicht. Jemand Ideen?</p>
<pre><code>template &lt;class T&gt;
void MyClass&lt;T&gt;::AcceptOwner(const T* value) const
{
	const Base* obj = dynamic_cast&lt;const Base*&gt;(value);
	if (obj)
	{
		Base* obj2 = const_cast&lt;Base*&gt;(obj);
		if (obj2)
		{
			obj2-&gt;ReferenceCounter(_counter);
		}
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2389243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389243</guid><dc:creator><![CDATA[Enuerator]]></dc:creator><pubDate>Sun, 16 Mar 2014 17:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 17:43:16 GMT]]></title><description><![CDATA[<p>Arbeite mit mutable um den const_cast wegzukriegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389245</guid><dc:creator><![CDATA[const_cast=böse]]></dc:creator><pubDate>Sun, 16 Mar 2014 17:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 17:46:27 GMT]]></title><description><![CDATA[<p>Ah, super. Genau das habe ich gesucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389246</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 16 Mar 2014 17:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 17:56:09 GMT]]></title><description><![CDATA[<p>Ich bekomme die Funktion allerdings immer noch nicht zum kompilieren. So gehts auch nicht:</p>
<pre><code>template &lt;class T&gt;
void MyClass&lt;T&gt;::AcceptOwner(const T* value) const
{
	T* obj = const_cast&lt;T*&gt;(value);
	if (obj)
	{
		Base* obj2 = dynamic_cast&lt;Base*&gt;(obj);
		if (obj2)
		{
			obj2-&gt;ReferenceCounter(_counter);
		}
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2389248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389248</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Sun, 16 Mar 2014 17:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 18:21:42 GMT]]></title><description><![CDATA[<p><code>const_cast</code> und <code>dynamic_cast</code> sehen schon mal verdächtig aus. Warum nimmt die Funktion nicht einen <code>T*</code> ? Und kannst du den <code>dynamic_cast</code> nicht mit virtuellen Funktionen umgehen?</p>
<p>Vielleicht grundsätzlich: Was genau willst du erreichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389255</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 16 Mar 2014 18:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 18:35:00 GMT]]></title><description><![CDATA[<p>const wegcasten funktioniert, wenn vorher const hingecastet wurde.</p>
<p>mach mal ein möglichst kleines aber vollständiges programm mit dem fehler und poste den code. dann können wir das in den compiler stopfen und den fehler wegfummeln. so freistehend fehlt einfach zu viel, es könnte an soo vielen anderen sachen liegen…</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389257</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 16 Mar 2014 18:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 18:40:52 GMT]]></title><description><![CDATA[<p>_counter wird wohl eher das Problem sein, wenn es ein Member ist, ist es in einer const-Funktion const!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389262</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 16 Mar 2014 18:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 19:09:17 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>const wegcasten funktioniert, wenn vorher const hingecastet wurde.</p>
</blockquote>
<p>Was sowas hier heisst?</p>
<pre><code>void doShit(SomeClass const * x)
{
	SomeClass * y = const_cast&lt;SomeClass*&gt;(x);
	x-&gt;alterState();
}

void foo()
{
	SomeClass obj;
	doShit(&amp;obj);
}
</code></pre>
<p>Oder wirklich sowas:</p>
<pre><code>void doShit(SomeClass * x)
{
	const SomeClass * cx = const_cast&lt;const SomeClass*&gt;(x);

	SomeClass * px = const_cast&lt;SomeClass*&gt;(cx);
}

void foo()
{
	SomeClass obj;
	doShit(&amp;obj);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2389270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389270</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 16 Mar 2014 19:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 19:12:35 GMT]]></title><description><![CDATA[<p>beides <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/2389272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389272</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 16 Mar 2014 19:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Sun, 16 Mar 2014 20:44:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a>: Verboten ist es, wenn das Objekt selbst (nicht Verweise darauf) als konstant deklariert wurde:</p>
<pre><code>const X x;
const_cast&lt;X&amp;&gt;(x).modify();
</code></pre>
<p>Compiler dürfen z.B. unter Annahme der Konstanz optimieren -&gt; UB</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389289</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 16 Mar 2014 20:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 00:24:21 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>const wegcasten funktioniert, wenn vorher const hingecastet wurde.</p>
</blockquote>
<p>Was sowas hier heisst?</p>
<pre><code>void doShit(SomeClass const * x)
{
	SomeClass * y = const_cast&lt;SomeClass*&gt;(x);
	x-&gt;alterState();
}

void foo()
{
	SomeClass obj;//Zur Laufzeit erstellt im RAM
	doShit(&amp;obj);
}
</code></pre>
<p>Oder wirklich sowas:</p>
<pre><code>void doShit(SomeClass * x)
{
	const SomeClass * cx = const_cast&lt;const SomeClass*&gt;(x);
	
	SomeClass * px = const_cast&lt;SomeClass*&gt;(cx);
}

void foo()
{
	SomeClass obj;////Zur Laufzeit erstellt im RAM
	doShit(&amp;obj);
}
</code></pre>
</blockquote>
<p>genau.</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code>const X x;//Autsch, kann der Compiler ins ROM legen!!!
const_cast&lt;X&amp;&gt;(x).modify();
</code></pre>
</blockquote>
<p>Unter ROM kann man da vieles verstehen. Vielleicht bei embedded systems in echte ROM-Bausteine rein. Vielleicht unter Windows ins Code-Segment (was vom Prozessor her als schreibgeschützt markiert wird und bei Speichermangel nicht(!) ausgelagert werden muss, sondern einfach aus dem RAM weggeworfen werden kann; bei Bedarf kann man's aus der exe-Datei ja wieder einlagern). Mir egal. Intel/AMD und gcc/MSVC und c++ einigen sich auf was, was verdammt flotten ausführbaren Code macht, ich muss mich nur an den c++-Standard halten. gcc ist oft so eklig, obwohl er eine bestimmte Optimierung tatsächlich gar nicht macht, zu erkennen, daß er sie als fieser Paragraphenreiter machen dürfte, also daß es UB wäre, und daß er den allerschnellsten erlaubten Code erzeugt, mithin alles wegoptimiert.</p>
<pre><code>static char c=0;
for(...){
   if(!++c) cout&lt;&lt;&quot;ich lebe noch&quot;&lt;&lt;endl;//nur alle 256 läufe eine ausgabe
   tuwas(...);
}
</code></pre>
<p>haha, gcc zeigt mir den Effenberg und sagt: Habe Dir nie versprochen, daß nach 127 die -128 kommt, ich optimiere das mal alles fein weg, denn es könnte auf einer hypotetischen Maschine so sein, daß der if-Zweig nie ausgeführt werden würde. Das ist ja allerliebts, daß gcc den schnellsten erlaubten Code erzeugt, echt supi. Aber er soll mir nicht das Wort im Mund herumdrehen. Er tut's aber und ist dabei so gewandt wie wenn Bashar, hustbaer, Arcoth und SeppJ sich zusammentun würden, um mir einen Programmierfehler nachzuweisen.</p>
<p>Ich musste fast alle meine 80er-Jahre-Tricks fallen lassen, so gemein ist der Compiler zu mir. Naja, aber er zaubert supi schnellen Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389303</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 17 Mar 2014 00:24:21 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 01:40:47 GMT]]></title><description><![CDATA[<blockquote>
<p>es könnte auf einer hypotetischen Maschine so sein, daß der if-Zweig nie ausgeführt werden würde.</p>
</blockquote>
<p>Rein aus interesse: Hast du das mal mit -funsigned-char kompiliert?</p>
<p>Und das ist leider immer UB, auch wenn <code>char</code> dieselben Werte wie <code>unsigned char</code> annehmen kann. Er gehört laut Standard eben einfach nicht zu den <em>unsigned integer types</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389309</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 17 Mar 2014 01:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 16:29:57 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Und das ist leider immer UB, auch wenn <code>char</code> dieselben Werte wie <code>unsigned char</code> annehmen kann. Er gehört laut Standard eben einfach nicht zu den <em>unsigned integer types</em>.</p>
</blockquote>
<p>Das ist nicht <em>immer</em> UB. Der Compiler muss vor dem Compile-Vorgang festlegen, ob char sich verhält wie signed char oder unsigned char. Falls er sich für unsigned char entschieden hat, muss das durchgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389423</guid><dc:creator><![CDATA[faragrasenschreiter]]></dc:creator><pubDate>Mon, 17 Mar 2014 16:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 17:01:23 GMT]]></title><description><![CDATA[<p>faragrasenschreiter schrieb:</p>
<blockquote>
<p>Der Compiler muss vor dem Compile-Vorgang festlegen, ob char sich verhält wie signed char oder unsigned char.</p>
</blockquote>
<p>Der Standard sagt nirgends, dass sich <code>char</code> wie <code>unsigned char</code> <strong>verhalten</strong> könnte. Er sagt nur, dass <code>char</code> <strong>dieselben Werte annehmen</strong> könnte. Überläufe sind nach wie vor undefiniert, weil <code>char</code> eben nicht zu der Gruppe von unsigned integers gehört.</p>
<p>Edit: Es könnte natürlich sein, dass der Standard mit &quot;unsigned integer&quot; einfach einen Typ der nur nicht-negative Werte annehmen kann meint... ja, das klingt sogar sehr plausibel...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389428</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 17 Mar 2014 17:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 17:47:08 GMT]]></title><description><![CDATA[<p>Ok, Ausgangspunkt ist folgender Programmcode:</p>
<pre><code>class Base
{
public:
	Base() : _counter(nullptr) {};

	void ReferenceCounter(int* counter) { _counter = counter; };

private:
	int* _counter;
};

class Derived : public Base
{
public:
	Derived() {};
};

template &lt;class T&gt;
class MyClass
{
public:
	MyClass(T* p);

private:
	int* _counter;
};

template &lt;class T&gt;
MyClass&lt;T&gt;::MyClass(T* value) :
	_counter(new int(1))
{
	Base* obj = dynamic_cast&lt;Base*&gt;(value);
	if (obj)
	{
		obj-&gt;ReferenceCounter(_counter);
	}
}

int main()
{
	MyClass&lt;const Derived&gt; myClass2(new Derived());
	std::cin.get();
	return 0;
}
</code></pre>
<p>Problem ist das const in der ersten Zeile der main-Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389433</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Mon, 17 Mar 2014 17:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 17:52:03 GMT]]></title><description><![CDATA[<p>Du kannst auch festlegen, dass das <code>const</code> ignoriert wird:</p>
<pre><code>template &lt;class T&gt;
struct MyClass&lt;T const&gt; : MyClass&lt;T&gt;
{
	using MyClass&lt;T&gt;::MyClass; // Ohne dieses Feature wird es eher hässlich
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2389435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389435</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 17 Mar 2014 17:52:03 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 18:18:29 GMT]]></title><description><![CDATA[<p>Dein Fehler ist, dass der <code>MyClass</code> -Konstruktor auch Zeiger auf konstante Objekte nimmt, obwohl er Schreibzugriff braucht. Daher entweder <code>std::remove_const</code> oder direkt einen neuen Funktionstemplateparameter einführen.</p>
<p>Warum <code>dynamic_cast</code> für einen einfachen Upcast, der auch implizit funktioniert? So verlagerst du nur Fehler auf die Laufzeit.</p>
<p>P.S.: Wenn du einen Smart-Pointer bastelst, kannst du ja mal bei <code>unique_ptr</code> (und evtl. sogar <code>shared_ptr</code> ) schauen, wie das gemacht wurde. Für den produktiven Einsatz würde ich von einem eigenen referenzgezählten Smart-Pointer aber abraten und direkt die beiden verwenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389437</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Mar 2014 18:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 18:28:50 GMT]]></title><description><![CDATA[<p>Richtig, es geht um eine eigene SmartPtr implementierung. Darum kommt auch kein std Kram in Frage. Der dynamic_cast ist evtl. überflüssig, aber es können ja auch Objekte die nicht von Base abgeleitet wurden übergeben werden. Ich wollte deshalb nur sicher gehen. Das ganze habe ich mir von shared_ptr abgeschaut. dort passiert folgendes:</p>
<pre><code>template&lt;class Y&gt;
    explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
    {
        boost::detail::sp_enable_shared_from_this( this, p, p );
    }

    template&lt;class X, class Y&gt; void _internal_accept_owner( shared_ptr&lt;X&gt; const * ppx, Y * py ) const
    {
        if( weak_this_.expired() )
        {
            weak_this_ = shared_ptr&lt;T&gt;( *ppx, py );
        }
    }

template&lt; class X, class Y, class T &gt; inline void sp_enable_shared_from_this( boost::shared_ptr&lt;X&gt; const * ppx, Y const * py, boost::enable_shared_from_this&lt; T &gt; const * pe )
{
    if( pe != 0 )
    {
        pe-&gt;_internal_accept_owner( ppx, const_cast&lt; Y* &gt;( py ) );
    }
}

template&lt; class X, class Y, class T &gt; inline void sp_enable_shared_from_this( boost::shared_ptr&lt;X&gt; * ppx, Y const * py, boost::enable_shared_from_this2&lt; T &gt; const * pe )
{
    if( pe != 0 )
    {
        pe-&gt;_internal_accept_owner( ppx, const_cast&lt; Y* &gt;( py ) );
    }
}
</code></pre>
<p>Das ganze wollte ich nun auf meine Implementierung übertragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389439</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Mon, 17 Mar 2014 18:28:50 GMT</pubDate></item><item><title><![CDATA[Reply to const wegcasten funtioniert nicht on Mon, 17 Mar 2014 19:00:34 GMT]]></title><description><![CDATA[<p>Enumerator schrieb:</p>
<blockquote>
<p>Der dynamic_cast ist evtl. überflüssig, aber es können ja auch Objekte die nicht von Base abgeleitet wurden übergeben werden. Ich wollte deshalb nur sicher gehen.</p>
</blockquote>
<p>Einfach nichts tun halte ich für eine schlechte Idee. Wenn du den Smart-Pointer auf von <code>Base</code> abgeleitete Klassen auslegst, solltest du eher falsche Benutzung verhindern, z.B. mit <code>static_assert</code> in der Klassendefinition.</p>
<p>Enumerator schrieb:</p>
<blockquote>
<p>Das ganze habe ich mir von shared_ptr abgeschaut. dort passiert folgendes:</p>
</blockquote>
<p><code>shared_ptr</code> hat aber einen separaten Reference-Counter, der nicht im Pointee-Objekt eingebaut ist. Daher kann er auch konstante Objekte im Konstruktor annehmen. In deinem Fall solltest du eher das Design überdenken als <code>const</code> leichtsinnig wegzucasten.</p>
<p>Wenn du wirklich Reference-Counter innerhalb der Pointee-Objekte willst (wodurch die Benutzerfreundlichkeit sinkt), schau dir <code>boost::intrusive_ptr</code> an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389442</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Mar 2014 19:00:34 GMT</pubDate></item></channel></rss>