<?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[CopyCtor und Referenz]]></title><description><![CDATA[<p>Abend!</p>
<p>Simple Frage:<br />
Wenn eine Klasse eine Referenz als Member hat: Macht dann der vom Compiler generierte CopyCtor das richtige? Oder muss ich mir dann den CopyCtor selber schreiben?<br />
Oder macht ein CopyCtor bei Klasse mit Referenz als Member generell keinen Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325670/copyctor-und-referenz</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 01:44:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325670.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 May 2014 19:09:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 19:09:11 GMT]]></title><description><![CDATA[<p>Abend!</p>
<p>Simple Frage:<br />
Wenn eine Klasse eine Referenz als Member hat: Macht dann der vom Compiler generierte CopyCtor das richtige? Oder muss ich mir dann den CopyCtor selber schreiben?<br />
Oder macht ein CopyCtor bei Klasse mit Referenz als Member generell keinen Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398884</guid><dc:creator><![CDATA[CopyFrager]]></dc:creator><pubDate>Mon, 12 May 2014 19:09:11 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 19:14:00 GMT]]></title><description><![CDATA[<p>CopyFrager schrieb:</p>
<blockquote>
<p>Wenn eine Klasse eine Referenz als Member hat</p>
</blockquote>
<p>... dann ist das schlechtes Design und sollte schleunigst geändert werden. Nimm stattdessen einen Pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398885</guid><dc:creator><![CDATA[refmem]]></dc:creator><pubDate>Mon, 12 May 2014 19:14:00 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 19:16:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Macht dann der vom Compiler generierte CopyCtor das richtige?</p>
</blockquote>
<p>Ja, er initialisiert die Member-Referenz mit der anderen Referenz.</p>
<p>[class.copy]/15 schrieb:</p>
<blockquote>
<p>The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members.<br />
[...] Let x be [...] the parameter of the constructor [...]. Each base or non-static data member is copied/moved in the manner appropriate to its type:<br />
— if the member is an array, each element is direct-initialized with the corresponding subobject of <code>x</code> ;<br />
— if a member <code>m</code> has rvalue reference type <code>T&amp;&amp;</code> , it is direct-initialized with <code>static_cast&lt;T&amp;&amp;&gt;(x.m)</code> ;<br />
— otherwise, the base or member is direct-initialized with the corresponding base or member of <code>x</code> .</p>
</blockquote>
<p>Das ist auch das &quot;Richtige&quot;. Oder was erwartest du?</p>
<blockquote>
<p>Oder macht ein CopyCtor bei Klasse mit Referenz als Member generell keinen Sinn?</p>
</blockquote>
<p>Ne, macht sie nicht. Willst du Gründe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398886</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 12 May 2014 19:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 19:27:53 GMT]]></title><description><![CDATA[<p>@Arcoth: Danke für die gute Antwort!</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Ne, macht sie nicht. Willst du Gründe?</p>
</blockquote>
<p>Ja, gerne! Der Compiler erzeugt einen CopyCtor und der funktioniert auch mit Referenzen als Member. Dann sollte das doch passen?</p>
<p>Ich habe nur bemerkt, dass der operator= offenbar NICHT mehr vom Compiler geniert wird.<br />
Kann es sein, dass ich bei einer Referenz als Member den operator= gar nicht sinnvoll definieren KANN? Heißt das dann Klassen mit Referenz als Member sind niemals kopierbar? (wenn operator= nicht geht, sollte ich ja auch gleich CopyCtor ausschalten, denn nur einen von beiden zu haben ist ja schlecht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398887</guid><dc:creator><![CDATA[CopyFrager]]></dc:creator><pubDate>Mon, 12 May 2014 19:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 19:37:31 GMT]]></title><description><![CDATA[<p>CopyFrager schrieb:</p>
<blockquote>
<p>@Arcoth: Danke für die gute Antwort!</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Ne, macht sie nicht. Willst du Gründe?</p>
</blockquote>
<p>Ja, gerne! Der Compiler erzeugt einen CopyCtor und der funktioniert auch mit Referenzen als Member. Dann sollte das doch passen?</p>
</blockquote>
<p>Ja, wie das passt, aber wie du schon unten richtig bemerkt hast:</p>
<blockquote>
<p>Ich habe nur bemerkt, dass der operator= offenbar NICHT mehr vom Compiler geniert wird.</p>
</blockquote>
<blockquote>
<p>Kann es sein, dass ich bei einer Referenz als Member den operator= gar nicht sinnvoll definieren KANN?</p>
</blockquote>
<p>Korrekt, Referenzen sind nicht veränderbar.</p>
<blockquote>
<p>Heißt das dann Klassen mit Referenz als Member sind niemals kopierbar? (wenn operator= nicht geht, sollte ich ja auch gleich CopyCtor ausschalten, denn nur einen von beiden zu haben ist ja schlecht)</p>
</blockquote>
<p>Die Folgerung ist falsch. Es macht durchaus Sinn Klassen zu haben, die man nur einmal als Kopie von etwas erstellen kann, aber anschließend nicht ändern. Ich verwende sie von Zeit zu Zeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398889</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 12 May 2014 19:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 19:42:31 GMT]]></title><description><![CDATA[<p>CopyFrager schrieb:</p>
<blockquote>
<p>Kann es sein, dass ich bei einer Referenz als Member den operator= gar nicht sinnvoll definieren KANN?</p>
</blockquote>
<p>Kommt auf deine Definition von sinnvoll an, aber wenn sinnvoll=zuweisen ist dann ist es richtig.</p>
<p>CopyFrager schrieb:</p>
<blockquote>
<p>Heißt das dann Klassen mit Referenz als Member sind niemals kopierbar? (wenn operator= nicht geht, sollte ich ja auch gleich CopyCtor ausschalten, denn nur einen von beiden zu haben ist ja schlecht)</p>
</blockquote>
<p>Kopieren geht. Zuweisen nicht. Es gibt bestimmt Fälle wo soetwas sinnvoll ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398890</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Mon, 12 May 2014 19:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 20:08:41 GMT]]></title><description><![CDATA[<blockquote>
<p>Heißt das dann Klassen mit Referenz als Member sind niemals kopierbar?</p>
</blockquote>
<p>Doch. Aber es kann nicht die Referenz umgebogen (da das in C++ offensichtlich nicht funktioniert), sondern lediglich das Objekt, auf das verwiesen wird, zugewiesen werden.</p>
<blockquote>
<p>Ich habe nur bemerkt, dass der operator= offenbar NICHT mehr vom Compiler geniert wird.</p>
</blockquote>
<p>Korrekt! Das wird (u.a.) automatisch unterbunden, sobald eine Klasse eine Referenz als (nicht-statischen) Member hat:</p>
<p>[class.copy]/23 schrieb:</p>
<blockquote>
<p>A defaulted copy/move assignment operator for class <code>X</code> is defined as deleted if <code>X</code> has:<br />
[...]<br />
— a non-static data member of reference type, or</p>
</blockquote>
<p>Und hier die Gründe warum Referenzen als Member keinen Sinn machen, bzw. immer schlechter sind als (ggf. konstante) Zeiger:</p>
<ul>
<li>Wendest du den <code>sizeof</code> -Operator auf eine Referenz an, gibt er dir die Größe des referenzierten Typs zurück. Tatsächlich aber ist die Größe einer Referenz meistens eine andere - bspw. die eines Zeigers.</li>
</ul>
<p>Wendest du den <code>sizeof</code> -Operator auf eine Klasse an, die eine Referenz als (nicht-statischen) Member hat, merkst du das schnell:</p>
<pre><code>struct A
{
	char&amp; m;
};

#include &lt;utility&gt;

int main()
{
	static_assert( sizeof(std::declval&lt;A&gt;().m) == 1, &quot;&quot; );
	static_assert( sizeof(std::declval&lt;A&gt;()) == sizeof(void*), &quot;&quot; );
}
</code></pre>
<ul>
<li>Weil der Standard die interne Darstellung einer Referenz nur äußerst vage festlegt, haben Klassen mit einer Referenz als Member kein standard-layout.</li>
<li>Sie sind nicht verbiegbar; Nutzt man jedoch Zeiger, kann man lediglich mit einem top-level <code>const</code> triggern, ob man den Zeiger verändern darf oder nicht.</li>
<li>Referenzen sind keine Objekte, folglich haben sie keine Adresse. Memberzeiger sind damit nicht möglich. (Ein eher schwaches Argument)</li>
<li>Eine Referenz hat keinen Nullzustand. Das ist aber nicht wirklich ein richtiges Argument für irgendetwas, weil es gleichzeitig ein Vorteil und ein Nachteil ist - es ist mehr ein Unterschied.</li>
</ul>
<p>Es gibt selten Fälle, wo Semantiken einer Referenz (bspw. fehlender Nullzustand, Unumbiegbarkeit) gewünscht sind, aber das sind Ausnahmen, die die Regel bestätigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398892</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 12 May 2014 20:08:41 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 20:09:01 GMT]]></title><description><![CDATA[<p>Naja, ich habe bewusst eine Referenz genommen, weil sich das Objekt, das referenziert wird, IMMER existieren muss. Es kann also nie &quot;NULL&quot; sein - da fand ich die Referenz besser. Wenn es nie Sinn machen würde, würde es C++ ja auch kaum erlauben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398894</guid><dc:creator><![CDATA[CopyFrager]]></dc:creator><pubDate>Mon, 12 May 2014 20:09:01 GMT</pubDate></item><item><title><![CDATA[Reply to CopyCtor und Referenz on Mon, 12 May 2014 20:13:21 GMT]]></title><description><![CDATA[<p>CopyFrager schrieb:</p>
<blockquote>
<p>Wenn es nie Sinn machen würde, würde es C++ ja auch kaum erlauben?</p>
</blockquote>
<p>C++ ist nicht darauf ausgelegt, Dinge zu verbieten, die nie Sinn machen würden.<br />
Eines der Hauptphilosophien von C++ ist es, jeden Programmierstil zu erlauben.<br />
Man kann in C++ ja auch manuell mit Speicher hantieren oder nicht virtuelle, nciht protected Destruktoren in Basisklassen haben, auch wenn das &quot;nie&quot; Sinn macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398896</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 12 May 2014 20:13:21 GMT</pubDate></item></channel></rss>