<?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[Lebenszeit einer Instanz]]></title><description><![CDATA[<p>Hallo, ich möchte die folgende Syntax für eine Funktion unterstützen:</p>
<pre><code class="language-cpp">p.add(3) &lt;&lt; 1, 2, 3;
</code></pre>
<p>Ich habe das ganze so gelöst, dass die add-Methode eine Instanz der Klasse 'writer' zurück gibt:</p>
<pre><code class="language-cpp">writer whatever::add(byte cid) {
	return writer(*this, cid);
}
</code></pre>
<p>Und die Klasse 'writer' hat dann die Methoden operator,(int) und operator&lt;&lt;(int) implementiert, die jeweils eine Referenz auf *this zurück geben.</p>
<pre><code class="language-cpp">writer&amp; writer::operator&lt;&lt;(int value) {
	do_something(value);
	return *this;
}
</code></pre>
<p>Im Destruktor von 'writer' will ich dann abschließend noch irgendwas machen.</p>
<pre><code class="language-cpp">writer::~writer() {
	if(!everything_is_fine()) {
		throw std::runtime_error(&quot;some error&quot;);
	}
	do_something_important();
}
</code></pre>
<p>Nun zu meinen Fragen:<br />
1. warum wir das writer-Objekt bei der Rückgabe von add() nicht kopiert? Ist das return value optimization?<br />
2. ist es garantiert, dass meine writer-Instanz solange existiert, bis das Statement ganz oben abgearbeitet ist?<br />
3. gibt es eine Möglichkeit, das Speichern der Instanz zu verhindern? Obwohl ich bereits den Copy-Konstructor gelöscht habe, kann ich das Ergebnis von add() in eine Variable speichern (wohl durch die move-Semantik?).</p>
<pre><code class="language-cpp">writer(writer&amp;&amp;) = default;
writer(const writer&amp;) = delete;
void operator=(const writer&amp;) = delete;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/314236/lebenszeit-einer-instanz</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 09:48:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314236.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Feb 2013 17:14:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Sun, 24 Feb 2013 17:14:07 GMT]]></title><description><![CDATA[<p>Hallo, ich möchte die folgende Syntax für eine Funktion unterstützen:</p>
<pre><code class="language-cpp">p.add(3) &lt;&lt; 1, 2, 3;
</code></pre>
<p>Ich habe das ganze so gelöst, dass die add-Methode eine Instanz der Klasse 'writer' zurück gibt:</p>
<pre><code class="language-cpp">writer whatever::add(byte cid) {
	return writer(*this, cid);
}
</code></pre>
<p>Und die Klasse 'writer' hat dann die Methoden operator,(int) und operator&lt;&lt;(int) implementiert, die jeweils eine Referenz auf *this zurück geben.</p>
<pre><code class="language-cpp">writer&amp; writer::operator&lt;&lt;(int value) {
	do_something(value);
	return *this;
}
</code></pre>
<p>Im Destruktor von 'writer' will ich dann abschließend noch irgendwas machen.</p>
<pre><code class="language-cpp">writer::~writer() {
	if(!everything_is_fine()) {
		throw std::runtime_error(&quot;some error&quot;);
	}
	do_something_important();
}
</code></pre>
<p>Nun zu meinen Fragen:<br />
1. warum wir das writer-Objekt bei der Rückgabe von add() nicht kopiert? Ist das return value optimization?<br />
2. ist es garantiert, dass meine writer-Instanz solange existiert, bis das Statement ganz oben abgearbeitet ist?<br />
3. gibt es eine Möglichkeit, das Speichern der Instanz zu verhindern? Obwohl ich bereits den Copy-Konstructor gelöscht habe, kann ich das Ergebnis von add() in eine Variable speichern (wohl durch die move-Semantik?).</p>
<pre><code class="language-cpp">writer(writer&amp;&amp;) = default;
writer(const writer&amp;) = delete;
void operator=(const writer&amp;) = delete;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2301701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301701</guid><dc:creator><![CDATA[Oliver Bestmann]]></dc:creator><pubDate>Sun, 24 Feb 2013 17:14:07 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Sun, 24 Feb 2013 18:10:06 GMT]]></title><description><![CDATA[<p>2. Ja.<br />
3. Nein.</p>
<p>Ganz ehrlich, auch wenn das auf den ersten Blick hübsch wirken mag, solche Sprach-Konstrukte sollte man doch sehr genau überdenken, in den meisten Fällen sind sie nämlich eher unnötig und produzieren auf lange Sicht schlechteren Code. Was spricht gegen add(1, 2, 3)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301709</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 24 Feb 2013 18:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Sun, 24 Feb 2013 20:45:07 GMT]]></title><description><![CDATA[<p>Schonmal vielen Dank.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Was spricht gegen add(1, 2, 3)?</p>
</blockquote>
<p>Es muss sich bei den Parametern nicht zwingend um ints handeln, sondern es können float- und int-Werte gemischt vorkommen. Außerdem ist die Anzahl der Parameter dynamisch. Ich habe bereits vorher eine typsichere Variante mit</p>
<pre><code>template&lt;class T...&gt; void add(int, T...)
</code></pre>
<p>implementiert, die auch nur die für den jeweiligen Fall gewünschte Anzahl an Parametern annimmt, jedoch soll das ganze später mit SWIG aus Python heraus nutzbar gemacht werden, und dann funktioniert Metaprogrammierung natürlich nicht mehr, darum habe ich mich jetzt erstmal für diese Variante entschieden.</p>
<p>Das ganze habe ich so ähnlich auch schonmal hier gesehen: <a href="http://eigen.tuxfamily.org/dox/TutorialMatrixClass.html#TutorialMatrixCommaInitializer" rel="nofollow">http://eigen.tuxfamily.org/dox/TutorialMatrixClass.html#TutorialMatrixCommaInitializer</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301742</guid><dc:creator><![CDATA[Oliver Bestmann]]></dc:creator><pubDate>Sun, 24 Feb 2013 20:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Sun, 24 Feb 2013 21:32:51 GMT]]></title><description><![CDATA[<p>Oliver Bestmann schrieb:</p>
<blockquote>
<p>Im Destruktor von 'writer' will ich dann abschließend noch irgendwas machen.</p>
<pre><code class="language-cpp">writer::~writer() {
	if(!everything_is_fine()) {
		throw std::runtime_error(&quot;some error&quot;);
	}
	do_something_important();
}
</code></pre>
</blockquote>
<p>Im Destruktor eine Exception werfen ist eine ganz schlechte Idee. Das soll man nie machen.</p>
<p>Hintergrund ist, dass ein Destruktor möglicherweise zwischen throw und catch aufgerufen werden kann. Wenn da dann noch ein throw kommt, gibt es garantiert Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301752</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Sun, 24 Feb 2013 21:32:51 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Sun, 24 Feb 2013 21:52:05 GMT]]></title><description><![CDATA[<p>Oliver Bestmann: Dann nimm die Lösung aus C, die funktioniert auch ohne Templates. <a href="http://en.cppreference.com/w/cpp/utility/variadic" rel="nofollow">http://en.cppreference.com/w/cpp/utility/variadic</a><br />
Ist wahrscheinlich immer noch sicherer als so ein komisches Writer-Objekt, bei dem man dann immer aufpassen muss es nicht zu kopieren etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301760</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 24 Feb 2013 21:52:05 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Mon, 25 Feb 2013 06:52:47 GMT]]></title><description><![CDATA[<p>Oliver Bestmann schrieb:</p>
<blockquote>
<p>Das ganze habe ich so ähnlich auch schonmal hier gesehen: <a href="http://eigen.tuxfamily.org/dox/TutorialMatrixClass.html#TutorialMatrixCommaInitializer" rel="nofollow">http://eigen.tuxfamily.org/dox/TutorialMatrixClass.html#TutorialMatrixCommaInitializer</a></p>
</blockquote>
<p>Auch wenn sowas auf den ersten Blick echt cool zu sein scheint. Man hat keinerlei Idee was die Nebeneffekte dieser Überladungen angeht.</p>
<p>Gerade bei diesem Beispiel, die meisten können nicht mal sagen, wo und wann der Kommaoperator vorkommt und wann er aufgerufen wird. Und dass dieser dann auch noch was anderes macht als man denkt, das wird verquer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301805</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 25 Feb 2013 06:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszeit einer Instanz on Mon, 25 Feb 2013 06:57:48 GMT]]></title><description><![CDATA[<p>Ich finde die Syntac so in Ordnung. Insbesondere auch das Beispiel aus eigen.<br />
Es ist so wunderbar intuitiv, fast wie die mathematische Formulierung.</p>
<p>Aus<br />
a=(b,c,d)</p>
<p>wird<br />
a &lt;&lt; b,c,d</p>
<p>@cooky ich sehe das Problem bei diesen writer-objekten nicht. Es schreibt ja niemand code wie</p>
<p>foo(a&lt;&lt;b,c,d)</p>
<p>oder<br />
Writer w = (a&lt;&lt;b,c,d);</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301806</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 25 Feb 2013 06:57:48 GMT</pubDate></item></channel></rss>