<?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[Referenzen in C++]]></title><description><![CDATA[<p>Hey,</p>
<p>ich muss heute doch mal nachfragen, wie es sich mit den Referenzen genau verhält. Der Eintrag in der FAQ hat mehr Fragen aufgeworfen, als benatwortet. Ich versuch mal alles der Reihe nach aufzulisten:</p>
<p><strong>Beispiel 1:</strong></p>
<pre><code class="language-cpp">foo&amp; func()
{
    return foo();
}

foo&amp; ref = func();
</code></pre>
<p>Illegal, weil unbenannte Referenzen nicht an nicht konstante Referenzen gebunden werden dürfen.<br />
Frage: ist foo() überhaupt ein gültiger Konstrukturaufruf?</p>
<p><strong>Beispiel 2:</strong></p>
<pre><code class="language-cpp">foo&amp; func()
{
    foo tmp;
    return tmp;
}

foo&amp; ref = func();
</code></pre>
<p>Illegal, weil das foo-Objekt zum Ende der Funktion zerstört wird. Referenzen beeinflussen nicht die Lebensdauer von Objekten.</p>
<p><strong>Beispiel 3:</strong></p>
<pre><code class="language-cpp">const foo&amp; func()
{
    return foo();
}

const foo&amp; ref = func();
</code></pre>
<p>Illegal. Das unbenannte, temporäre Objekt darf zwar an eine Konstante Referenz gebunden werden, das referenzierte Objekt wird aber trotzdem zum Ende der Funktion zerstört.</p>
<p><strong>Beispiel 4:</strong></p>
<pre><code class="language-cpp">foo&amp; func(foo&amp; f)
{
    return f;
}

foo&amp; ref = func(foo());
</code></pre>
<p>Illegal, Versuch ein temporäres Objekt an eine nicht-konstante Referenz zu binden.</p>
<p><strong>Beispiel 5:</strong></p>
<pre><code class="language-cpp">const foo&amp; func(const foo&amp; f)
{
    return f;
}

const foo&amp; ref = func(foo());
</code></pre>
<p>Das temporäre foo-Objekt liegt im Gültigkeitsbereich von func. Deshalb wird es nach der Funktion auch wieder zerstört. Kann zwar aufgerufen werden, ref ist aber an kein gültiges Objekt gebunden.</p>
<p>Gut, das wäre es vorerst. Ich hoffe, zumindest einige male richtig zu liegen. <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="🙂"
    /><br />
Ansonsten korrigiert mich bitte mit einer kleinen Erklärugn. <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/211742/referenzen-in-c</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 11:09:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211742.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Apr 2008 20:09:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzen in C++ on Sat, 26 Apr 2008 20:09:05 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>ich muss heute doch mal nachfragen, wie es sich mit den Referenzen genau verhält. Der Eintrag in der FAQ hat mehr Fragen aufgeworfen, als benatwortet. Ich versuch mal alles der Reihe nach aufzulisten:</p>
<p><strong>Beispiel 1:</strong></p>
<pre><code class="language-cpp">foo&amp; func()
{
    return foo();
}

foo&amp; ref = func();
</code></pre>
<p>Illegal, weil unbenannte Referenzen nicht an nicht konstante Referenzen gebunden werden dürfen.<br />
Frage: ist foo() überhaupt ein gültiger Konstrukturaufruf?</p>
<p><strong>Beispiel 2:</strong></p>
<pre><code class="language-cpp">foo&amp; func()
{
    foo tmp;
    return tmp;
}

foo&amp; ref = func();
</code></pre>
<p>Illegal, weil das foo-Objekt zum Ende der Funktion zerstört wird. Referenzen beeinflussen nicht die Lebensdauer von Objekten.</p>
<p><strong>Beispiel 3:</strong></p>
<pre><code class="language-cpp">const foo&amp; func()
{
    return foo();
}

const foo&amp; ref = func();
</code></pre>
<p>Illegal. Das unbenannte, temporäre Objekt darf zwar an eine Konstante Referenz gebunden werden, das referenzierte Objekt wird aber trotzdem zum Ende der Funktion zerstört.</p>
<p><strong>Beispiel 4:</strong></p>
<pre><code class="language-cpp">foo&amp; func(foo&amp; f)
{
    return f;
}

foo&amp; ref = func(foo());
</code></pre>
<p>Illegal, Versuch ein temporäres Objekt an eine nicht-konstante Referenz zu binden.</p>
<p><strong>Beispiel 5:</strong></p>
<pre><code class="language-cpp">const foo&amp; func(const foo&amp; f)
{
    return f;
}

const foo&amp; ref = func(foo());
</code></pre>
<p>Das temporäre foo-Objekt liegt im Gültigkeitsbereich von func. Deshalb wird es nach der Funktion auch wieder zerstört. Kann zwar aufgerufen werden, ref ist aber an kein gültiges Objekt gebunden.</p>
<p>Gut, das wäre es vorerst. Ich hoffe, zumindest einige male richtig zu liegen. <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="🙂"
    /><br />
Ansonsten korrigiert mich bitte mit einer kleinen Erklärugn. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1498727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498727</guid><dc:creator><![CDATA[Referent]]></dc:creator><pubDate>Sat, 26 Apr 2008 20:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in C++ on Sat, 26 Apr 2008 22:06:18 GMT]]></title><description><![CDATA[<p>Referent schrieb:</p>
<blockquote>
<p><strong>Beispiel 1:</strong></p>
<pre><code class="language-cpp">foo&amp; func()
{
    return foo();
}

foo&amp; ref = func();
</code></pre>
<p>Illegal, weil unbenannte Referenzen nicht an nicht konstante Referenzen gebunden werden dürfen.<br />
Frage: ist foo() überhaupt ein gültiger Konstrukturaufruf?</p>
</blockquote>
<p>Nicht legal (ill-formed, unter der Annahme, dass die Top-Level cv-Qualifikation nicht foo const ist) ist hier</p>
<pre><code class="language-cpp">return foo();
</code></pre>
<p>foo() erstellt ein value-initialisiertes rvalue vom Typ foo - falls foo eine Klasse ist, resultiert das im Aufruf des Defaultkonstruktors. Illegal ist das statement deshalb, weil Referenzen auf nicht konstantes T nicht an <em>rvalues</em> gebunden werden können.<br />
(Ich will das hier nicht vertiefen, denn dafür wäre ein eigener faq-Eintrag angebracht: Ausdrücke sind entweder lvalues oder rvalues. Einfach gesagt repräsentieren skalare lvalues Objekte, während skalare rvalues Werte repräsentieren. Haben wir es mit Klassen zu tun, ist die Einteilung in diesem Sinne nicht mehr sinnvoll, allerdings bleibt die Klassifizierung entsprechend der syntaktischen Form bestehen.)</p>
<p>Referent schrieb:</p>
<blockquote>
<p><strong>Beispiel 2:</strong></p>
<pre><code class="language-cpp">foo&amp; func()
{
    foo tmp;
    return tmp;
}

foo&amp; ref = func();
</code></pre>
<p>Illegal, weil das foo-Objekt zum Ende der Funktion zerstört wird. Referenzen beeinflussen nicht die Lebensdauer von Objekten.</p>
</blockquote>
<p>Undefiniert ist hier die Initialisierung der Referenz ref, an der Funktion selbst ist nichts auszusetzen (nur formal versteht sich).</p>
<p>Referent schrieb:</p>
<blockquote>
<p><strong>Beispiel 3:</strong></p>
<pre><code class="language-cpp">const foo&amp; func()
{
    return foo();
}

const foo&amp; ref = func();
</code></pre>
<p>Illegal. Das unbenannte, temporäre Objekt darf zwar an eine Konstante Referenz gebunden werden, das referenzierte Objekt wird aber trotzdem zum Ende der Funktion zerstört.</p>
</blockquote>
<p>Analog zu Beispiel 2.</p>
<p>Referent schrieb:</p>
<blockquote>
<p><strong>Beispiel 4:</strong></p>
<pre><code class="language-cpp">foo&amp; func(foo&amp; f)
{
    return f;
}

foo&amp; ref = func(foo());
</code></pre>
<p>Illegal, Versuch ein temporäres Objekt an eine nicht-konstante Referenz zu binden.</p>
</blockquote>
<p>Analog zu Beispiel 1. Ill-formed ist hier der Funktionsaufruf</p>
<pre><code class="language-cpp">func(foo());
</code></pre>
<p>Referent schrieb:</p>
<blockquote>
<p><strong>Beispiel 5:</strong></p>
<pre><code class="language-cpp">const foo&amp; func(const foo&amp; f)
{
    return f;
}

const foo&amp; ref = func(foo());
</code></pre>
<p>Das temporäre foo-Objekt liegt im Gültigkeitsbereich von func. Deshalb wird es nach der Funktion auch wieder zerstört. Kann zwar aufgerufen werden, ref ist aber an kein gültiges Objekt gebunden.</p>
</blockquote>
<p>Hier ist tatsächlich alles in Ordnung. Aber wie richtig erkannt wurde, wird das Objekt, an das ref gebunden wurde, nach der Initialisierung der Referenz zerstört (und der Speicher freigegeben). Diese Referenz kann nicht weiter verwendet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498801</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 26 Apr 2008 22:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in C++ on Sat, 26 Apr 2008 23:32:32 GMT]]></title><description><![CDATA[<p>Danke für die Antwort! <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="🙂"
    /> Wenn ich das richtig verstehe, dann liege ich mit meinen Annahmen immer richtig? (Wenn man davon absieht, dass ich das mangels Fachkenntnis alles deutlich vereinfacht dargestellt habe). <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>
<p>Und was sagt ill-formed genau aus?</p>
<p>Was mir jetzt zu foo() noch auffällt: Das könnte ja genau so gut eine Funktion sein. Mein Compiler hängt sich auch auf, wenn es neben der Klasse foo noch eine Funktion foo gibt. Gibt es eine Möglichkeit, das eindeutig auszudrücken? Für den default-ctor bei benannten Objekten lässt man dazu ja einfach die Klammern weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498822</guid><dc:creator><![CDATA[Referent]]></dc:creator><pubDate>Sat, 26 Apr 2008 23:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in C++ on Sun, 27 Apr 2008 00:48:53 GMT]]></title><description><![CDATA[<p>Referent schrieb:</p>
<blockquote>
<p>Danke für die Antwort! <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="🙂"
    /> Wenn ich das richtig verstehe, dann liege ich mit meinen Annahmen immer richtig? (Wenn man davon absieht, dass ich das mangels Fachkenntnis alles deutlich vereinfacht dargestellt habe). <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="😉"
    /><br />
Und was sagt ill-formed genau aus?</p>
</blockquote>
<p>Ein Fehler, der vom Compiler als solcher erkannt und angezeigt werden muss (einschließlich Syntaxfehlern) oder ein Verstoß gegen die ODR. Im Gegensatz zu Verstößen, die der Compiler erkennen darf aber nicht muss und solchen Konstrukten, die bloß (möglicherweise nur bei bestimmtem Input) undefiniertes Verhalten haben.</p>
<p>Referent schrieb:</p>
<blockquote>
<p>Was mir jetzt zu foo() noch auffällt: Das könnte ja genau so gut eine Funktion sein. Mein Compiler hängt sich auch auf, wenn es neben der Klasse foo noch eine Funktion foo gibt. Gibt es eine Möglichkeit, das eindeutig auszudrücken? Für den default-ctor bei benannten Objekten lässt man dazu ja einfach die Klammern weg.</p>
</blockquote>
<p>Im gleichen Namensraum können entweder eine Klasse oder eine Aufzählung und entweder ein Objekt, eine (möglicherweise überladene) Funktion oder eine Aufzählungskonstante gleichen Namens existieren. In diesem Falle wird die Klasse bzw. der Aufzählungstyp verdeckt. Dieses Feature existiert nur zwecks C-Kompatibilität, denn dort haben Tagnamen ihren eigenen Namensraum. Ansonsten sollte man diese Möglichkeit nicht nutzen. In einer solchen Situation kann man wie in C auf die Klasse bzw. die Aufzählung zugreifen, indem man enum,struct,class,union davorschreibt. Unabhängig davon wären obige Beispiele, wenn foo eine Funktion wäre, alle ill-formed. Dann ist schon die Referenzdeklaration fehlerhaft, da foo kein Typ wäre. Sollte foo dagegen ein Funktions<em>typ</em> sein, wäre der Ausdruck foo() ill-formed, Beispiel 2 allerdings möglich - natürlich müsste dann tmp noch irgendwo definiert werden, denn</p>
<pre><code class="language-cpp">foo tmp;
</code></pre>
<p>ist dann nur eine Funktions<em>deklaration</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498839</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 27 Apr 2008 00:48:53 GMT</pubDate></item></channel></rss>