<?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[Einige Fragen zu Casts und Cast-Operatoren]]></title><description><![CDATA[<p>Nachdem letztends die Diskussion übe rdie C Casts hier durchgerauscht ist wolte ich mir das ganze mal genauer anschaun und bin dabei auf einige Fragen gestoßen.</p>
<p>Bei den static_casts habe ich ein Beispiel gefudnen das die static_casts auf Zeiger gültig sind wenn die Zeiger von verwandten Klassen stammen, ist der cast dann nicht gleichbedeutend mit einem reinterpret_cast?</p>
<pre><code class="language-cpp">class CBase {};
class CDerived: public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast&lt;CDerived*&gt;(a);
</code></pre>
<p>Bei den reinterpret_cast wird das Bitmuster ja einfach anders Interpretiert, aber warum funktioniert eigentlich folgendes nicht</p>
<pre><code class="language-cpp">int=reinterpret_cast&lt;int&gt;(float);
</code></pre>
<p>Die Anweisung wäre ja eigentlich Sonnenklar, ich will das das int das Bitmußter des float übernimmt. Aber wieso muß ich es so Kompliziert machen?</p>
<pre><code class="language-cpp">int=static_cast&lt;int&gt;(*(reinterpret_cast&lt;int*&gt;(&amp;float)));
</code></pre>
<p>Hat das irgendeinen einen tieferen Sinn?</p>
<p>Dann noch eine Frage zu Cast Operatoren, wenn ich folgendes mache:</p>
<pre><code class="language-cpp">class bar;

class foo
{
    operator bar()
    {};
};
</code></pre>
<p>Gehe ich dann richtig ind er annahme das diese beiden Ausdrücke exakt gleichwertig sind und beide diesen operator aufrufen? (ich gehe davon aus das es keinen passenden= Operator gibt der lhs ein bar und rhs ein foo nimtm und das kein Konstruktor in bar für ein foo existiert)</p>
<pre><code class="language-cpp">bar=foo;
bar=static_cast&lt;bar&gt;(foo);
</code></pre>
<p>Und zum Schluß noch die Frage, was ist der Unetrschied zwischen diesen beiden Cast operatoren</p>
<pre><code class="language-cpp">operator D3DCOLORVALUE ();
operator D3DCOLORVALUE&amp; ();
</code></pre>
<p>Ich werd hier nicht schlau draus welchen Sinn das &amp; hier genau machen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239629/einige-fragen-zu-casts-und-cast-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 10:17:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239629.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Apr 2009 20:51:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einige Fragen zu Casts und Cast-Operatoren on Sat, 25 Apr 2009 21:05:17 GMT]]></title><description><![CDATA[<p>Nachdem letztends die Diskussion übe rdie C Casts hier durchgerauscht ist wolte ich mir das ganze mal genauer anschaun und bin dabei auf einige Fragen gestoßen.</p>
<p>Bei den static_casts habe ich ein Beispiel gefudnen das die static_casts auf Zeiger gültig sind wenn die Zeiger von verwandten Klassen stammen, ist der cast dann nicht gleichbedeutend mit einem reinterpret_cast?</p>
<pre><code class="language-cpp">class CBase {};
class CDerived: public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast&lt;CDerived*&gt;(a);
</code></pre>
<p>Bei den reinterpret_cast wird das Bitmuster ja einfach anders Interpretiert, aber warum funktioniert eigentlich folgendes nicht</p>
<pre><code class="language-cpp">int=reinterpret_cast&lt;int&gt;(float);
</code></pre>
<p>Die Anweisung wäre ja eigentlich Sonnenklar, ich will das das int das Bitmußter des float übernimmt. Aber wieso muß ich es so Kompliziert machen?</p>
<pre><code class="language-cpp">int=static_cast&lt;int&gt;(*(reinterpret_cast&lt;int*&gt;(&amp;float)));
</code></pre>
<p>Hat das irgendeinen einen tieferen Sinn?</p>
<p>Dann noch eine Frage zu Cast Operatoren, wenn ich folgendes mache:</p>
<pre><code class="language-cpp">class bar;

class foo
{
    operator bar()
    {};
};
</code></pre>
<p>Gehe ich dann richtig ind er annahme das diese beiden Ausdrücke exakt gleichwertig sind und beide diesen operator aufrufen? (ich gehe davon aus das es keinen passenden= Operator gibt der lhs ein bar und rhs ein foo nimtm und das kein Konstruktor in bar für ein foo existiert)</p>
<pre><code class="language-cpp">bar=foo;
bar=static_cast&lt;bar&gt;(foo);
</code></pre>
<p>Und zum Schluß noch die Frage, was ist der Unetrschied zwischen diesen beiden Cast operatoren</p>
<pre><code class="language-cpp">operator D3DCOLORVALUE ();
operator D3DCOLORVALUE&amp; ();
</code></pre>
<p>Ich werd hier nicht schlau draus welchen Sinn das &amp; hier genau machen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1701296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1701296</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sat, 25 Apr 2009 21:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Casts und Cast-Operatoren on Sun, 26 Apr 2009 13:05:22 GMT]]></title><description><![CDATA[<p>Mal schauen, ob ich die Antworten richtig geben kann <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>Xebov schrieb:</p>
<blockquote>
<p>Bei den static_casts habe ich ein Beispiel gefudnen das die static_casts auf Zeiger gültig sind wenn die Zeiger von verwandten Klassen stammen, ist der cast dann nicht gleichbedeutend mit einem reinterpret_cast?</p>
</blockquote>
<p>Nein. Es ist im Standard nicht garantiert, dass der Zeiger auf <code>CDerived</code> der gleiche ist, wie der Zeiger auf <code>CBase</code> . Also <code>a</code> und <code>b</code> können verschiedene Werte enthalten in deinem Beispiel. Ein <code>reinterpret_cast</code> kümmert sich nicht weiter darum, interpretiert den Wert einfach um, was unter Umständen zu undefiniertem Verhalten führt. Ein <code>static_cast</code> dagegen kann bei einfacher Vererbung (keine Mehrfachvererbung) dies zur Kompilezeit feststellen und den Zeiger somit richtig umbiegen lassen, also wird kein undefiniertes Verhalten ausgelöst. Bei Mehrfachvererbung bekommst du bei einem <code>static_cast</code> allerdings einen Kompilerfehler, da auch der <code>static_cast</code> nicht mehr ausreicht und nur noch ein <code>dynamic_cast</code> dir helfen kann:</p>
<pre><code class="language-cpp">class BaseLeft { };
class BaseRight { };
class Derived
  : public BaseLeft
  , public BaseRight
{
};

// ...

Derived d;
BaseRight* br = &amp;d;

Derived* p = 0;

p = static_cast&lt;Derived*&gt;(br); // Kompilerfehler
p = dynamic_cast&lt;Derived*&gt;(br); // Funktioniert
p = reinterpret_cast&lt;Derived*&gt;(br); // Funktioniert, aber grosse Chancen für undefiniertes Verhalten!
</code></pre>
<p>Xebov schrieb:</p>
<blockquote>
<p>aber warum funktioniert eigentlich folgendes nicht</p>
<pre><code class="language-cpp">int=reinterpret_cast&lt;int&gt;(float);
</code></pre>
<p>Die Anweisung wäre ja eigentlich Sonnenklar, ich will das das int das Bitmußter des float übernimmt.</p>
</blockquote>
<p>Ich denke, dass es eben nicht so Sonnenklar ist. In 99,99% der Fälle meinen die Leute wahrscheinlich eher das hier:</p>
<pre><code class="language-cpp">float f = 34.8f;
int i = static_cast&lt;int&gt;(f);
</code></pre>
<p>Ich denke, dass die Verwechslungsgefahr viel zu hoch ist, deshalb hat man es verboten.</p>
<p>Xebov schrieb:</p>
<blockquote>
<p>Aber wieso muß ich es so Kompliziert machen?</p>
</blockquote>
<p>Du machst es auch viel zu kompliziert, das geht deutlich einfacher:</p>
<pre><code class="language-cpp">float f = 34.8f;
int i = *reinterpret_cast&lt;int*&gt;(&amp;f);
</code></pre>
<p>Xebov schrieb:</p>
<blockquote>
<p>Gehe ich dann richtig ind er annahme das diese beiden Ausdrücke exakt gleichwertig sind und beide diesen operator aufrufen? (ich gehe davon aus das es keinen passenden= Operator gibt der lhs ein bar und rhs ein foo nimtm und das kein Konstruktor in bar für ein foo existiert)</p>
</blockquote>
<p>Soweit mir bekannt ist, ja. Es könnte sein, dass im nächsten Standard es einen kleinen Unterschied gibt. Dort wird es wahrscheinlich explizite Konvertierungsoperatoren haben. Wenn der Operator also als explizit definiert ist, dann wird wohl nur die <code>static_cast</code> Variante funktionieren.</p>
<p>Xebov schrieb:</p>
<blockquote>
<p>Und zum Schluß noch die Frage, was ist der Unetrschied zwischen diesen beiden Cast operatoren</p>
<pre><code class="language-cpp">operator D3DCOLORVALUE ();
operator D3DCOLORVALUE&amp; ();
</code></pre>
<p>Ich werd hier nicht schlau draus welchen Sinn das &amp; hier genau machen soll.</p>
</blockquote>
<p>Kurzes Beispiel sollte hier wohl helfen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Foo
{
private:
	int m_i;

public:
	Foo(int i)
		: m_i(i)
	{
	}

	operator int&amp;()
	{
		return m_i;
	}

	int get_i() const
	{
		return m_i;
	}
};

int main()
{
	Foo f(10);

	std::cout &lt;&lt; f.get_i() &lt;&lt; std::endl;

	int&amp; i = f;
	i = 20;

	std::cout &lt;&lt; f.get_i() &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Die Ausgabe ist:</p>
<pre><code>10
20
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1701503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1701503</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 26 Apr 2009 13:05:22 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Casts und Cast-Operatoren on Sun, 26 Apr 2009 13:19:52 GMT]]></title><description><![CDATA[<p>OK das hilft mir schonmal weiter. Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1701511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1701511</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 26 Apr 2009 13:19:52 GMT</pubDate></item></channel></rss>