<?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[Lebzeit von Objekten]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>mir ist bekannt, dass Objekte innerhalb ihres Scopes {} gültig sind.<br />
Jetzt stellt sich mir die Frage, wielange zurückgegebene Objekte gültig sind.</p>
<p>Ich dachte dabei an etwas wie:</p>
<pre><code class="language-cpp">fb(bar() &lt;&lt; create_foo());
</code></pre>
<p>Also folgendes Beispiel liefert mir bei gcc 4.7.1:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct foo{
	~foo(){
		std::cout &lt;&lt; &quot;delete foo&quot; &lt;&lt; std::endl;
	}
};

struct bar{
	bar&amp; operator&lt;&lt;(const foo&amp;){
		std::cout &lt;&lt; &quot;bar&quot; &lt;&lt; std::endl;
		return *this;
	}
};

struct foobar{
	void operator()(const bar&amp;){
		std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
	}
};

foo create_foo(){
	return foo();
};

int main(){
	foobar fb;
	fb(bar() &lt;&lt; create_foo());
}
</code></pre>
<blockquote>
<p>bar<br />
foobar<br />
delete foo</p>
</blockquote>
<p>Die Frage ist für mich nun, ob der Standard diese Lebensdauer auch garantiert.<br />
Also meine Vermutung ist, dass der Scope mit dem abschließenden Semikolon beendet wird.<br />
Liege ich damit richtig?<br />
Also generell möchte ich etwas machen wie:</p>
<pre><code class="language-cpp">mysql_connection(select(&quot;mytable&quot;) &lt;&lt; equals(&quot;my_column1&quot;, &quot;value&quot;) &lt;&lt; greater(&quot;my_column2&quot;, 2));
</code></pre>
<p>wobei ich dann die conditions in einem std::vector zwischenspeicherns möchte.<br />
Also equals und greater liefern Objekte zurück, die von condition abgeleitet sind.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309798/lebzeit-von-objekten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 01:52:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309798.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Oct 2012 15:28:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lebzeit von Objekten on Sat, 27 Oct 2012 15:28:32 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>mir ist bekannt, dass Objekte innerhalb ihres Scopes {} gültig sind.<br />
Jetzt stellt sich mir die Frage, wielange zurückgegebene Objekte gültig sind.</p>
<p>Ich dachte dabei an etwas wie:</p>
<pre><code class="language-cpp">fb(bar() &lt;&lt; create_foo());
</code></pre>
<p>Also folgendes Beispiel liefert mir bei gcc 4.7.1:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct foo{
	~foo(){
		std::cout &lt;&lt; &quot;delete foo&quot; &lt;&lt; std::endl;
	}
};

struct bar{
	bar&amp; operator&lt;&lt;(const foo&amp;){
		std::cout &lt;&lt; &quot;bar&quot; &lt;&lt; std::endl;
		return *this;
	}
};

struct foobar{
	void operator()(const bar&amp;){
		std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
	}
};

foo create_foo(){
	return foo();
};

int main(){
	foobar fb;
	fb(bar() &lt;&lt; create_foo());
}
</code></pre>
<blockquote>
<p>bar<br />
foobar<br />
delete foo</p>
</blockquote>
<p>Die Frage ist für mich nun, ob der Standard diese Lebensdauer auch garantiert.<br />
Also meine Vermutung ist, dass der Scope mit dem abschließenden Semikolon beendet wird.<br />
Liege ich damit richtig?<br />
Also generell möchte ich etwas machen wie:</p>
<pre><code class="language-cpp">mysql_connection(select(&quot;mytable&quot;) &lt;&lt; equals(&quot;my_column1&quot;, &quot;value&quot;) &lt;&lt; greater(&quot;my_column2&quot;, 2));
</code></pre>
<p>wobei ich dann die conditions in einem std::vector zwischenspeicherns möchte.<br />
Also equals und greater liefern Objekte zurück, die von condition abgeleitet sind.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264684</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 27 Oct 2012 15:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sat, 27 Oct 2012 15:59:34 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Also meine Vermutung ist, dass der Scope mit dem abschließenden Semikolon beendet wird.</p>
</blockquote>
<p>Vermute ich auch, aber wieso interessiert das überhaupt? Du bindest jedes temporäre Objekt an const-ref. Damit ist doch schon sicher, dass das Objekt hinter der Referenz gültig ist. Sehe da keine Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264690</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sat, 27 Oct 2012 15:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sat, 27 Oct 2012 16:15:00 GMT]]></title><description><![CDATA[<p>Temporäre Objekte leben solange bis der Ausdruck vollständig ausgewertet wurde. Dann verschwinden sie. Der Ausdruck</p>
<p>XSpille schrieb:</p>
<blockquote>
<pre><code class="language-cpp">fb(bar() &lt;&lt; create_foo());
</code></pre>
</blockquote>
<p>erzeugt zwei temporäre Ojekte. Eins vom Typ bar und eins vom Typ foo. Wenn die Funktion foobar::operator() &quot;fertig&quot; ist, werden diese Objekte zerstört. Quasi beim Semikolon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264698</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 27 Oct 2012 16:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sat, 27 Oct 2012 17:42:48 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>Also meine Vermutung ist, dass der Scope mit dem abschließenden Semikolon beendet wird.</p>
</blockquote>
<p>Vermute ich auch, aber wieso interessiert das überhaupt? Du bindest jedes temporäre Objekt an const-ref. Damit ist doch schon sicher, dass das Objekt hinter der Referenz gültig ist. Sehe da keine Probleme.</p>
</blockquote>
<p>Damit wäre aber nur sichergestellt, dass foo lebt bis der operator&lt;&lt; ausgeführt ist, oder?</p>
<p>DANKE krümelkacker!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264719</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 27 Oct 2012 17:42:48 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sat, 27 Oct 2012 17:56:27 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>out schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>Also meine Vermutung ist, dass der Scope mit dem abschließenden Semikolon beendet wird.</p>
</blockquote>
<p>Vermute ich auch, aber wieso interessiert das überhaupt? Du bindest jedes temporäre Objekt an const-ref. Damit ist doch schon sicher, dass das Objekt hinter der Referenz gültig ist. Sehe da keine Probleme.</p>
</blockquote>
</blockquote>
<p>Wenn <code>operator&lt;&lt;</code> abgearbeitet ist, brauchst du <code>foo</code> doch auch nicht mehr, es hat seinen Zweck doch dann schon erfüllt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264722</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sat, 27 Oct 2012 17:56:27 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sun, 28 Oct 2012 12:35:51 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>out schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>Also meine Vermutung ist, dass der Scope mit dem abschließenden Semikolon beendet wird.</p>
</blockquote>
<p>Vermute ich auch, aber wieso interessiert das überhaupt? Du bindest jedes temporäre Objekt an const-ref. Damit ist doch schon sicher, dass das Objekt hinter der Referenz gültig ist. Sehe da keine Probleme.</p>
</blockquote>
</blockquote>
<p>Wenn <code>operator&lt;&lt;</code> abgearbeitet ist, brauchst du <code>foo</code> doch auch nicht mehr, es hat seinen Zweck doch dann schon erfüllt.</p>
</blockquote>
<p>Wie gesagt, ich möchte foo in einem vector speichern (und nicht sofort in einen String umwandeln), folglich schon <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/2264912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264912</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 28 Oct 2012 12:35:51 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sun, 28 Oct 2012 12:53:00 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Wie gesagt, ich möchte foo in einem vector speichern (und nicht sofort in einen String umwandeln), folglich schon <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>
</blockquote>
<p>Wenn der op&lt;&lt; das foo im vector speichert, dann wird das Speichern ja durchgeführt, bevor der op&lt;&lt; zu Ende ist und damit auch, bevor das temporäre foo zerstört wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264917</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 28 Oct 2012 12:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sun, 28 Oct 2012 13:58:23 GMT]]></title><description><![CDATA[<p>hi XSpille</p>
<pre><code class="language-cpp">mysql_connection(select(&quot;mytable&quot;) &lt;&lt; equals(&quot;my_column1&quot;, &quot;value&quot;) &lt;&lt; greater(&quot;my_column2&quot;, 2));
</code></pre>
<p>wofuer brauchst man sowas ?</p>
<p>ich denk mir mal das mit dem vector der mysql-string gebaut wird, aber warum der aufwand ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2264936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2264936</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 28 Oct 2012 13:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to Lebzeit von Objekten on Sun, 28 Oct 2012 19:06:32 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>Wie gesagt, ich möchte foo in einem vector speichern (und nicht sofort in einen String umwandeln), folglich schon <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>
</blockquote>
<p>Wenn der op&lt;&lt; das foo im vector speichert, dann wird das Speichern ja durchgeführt, bevor der op&lt;&lt; zu Ende ist und damit auch, bevor das temporäre foo zerstört wird.</p>
</blockquote>
<p>Nein... Ich speichere nur einen Zeiger auf das foo-Objekt und benötige es später beim fb()-Aufruf wieder.</p>
<p>Meep Meep schrieb:</p>
<blockquote>
<pre><code class="language-cpp">mysql_connection(select(&quot;mytable&quot;) &lt;&lt; equals(&quot;my_column1&quot;, &quot;value&quot;) &lt;&lt; greater(&quot;my_column2&quot;, 2));
</code></pre>
<p>wofuer brauchst man sowas ?</p>
</blockquote>
<p>Also ich baue mir etwas wie:</p>
<pre><code class="language-cpp">template&lt;&gt;
struct DBTable&lt;Foo&gt;{

	typedef ColumnInfo&lt;int_getter&lt;Foo&gt;, int_setter&lt;Foo&gt; &gt; bar_type;
	typedef ColumnInfo&lt;string_getter&lt;Foo&gt;, string_setter&lt;Foo&gt; &gt; foo_type;
	typedef PrimaryKey&lt;Foo, const bar_type&amp;, const foo_type&amp;&gt; primary_key_type;
	typedef ForeignKey&lt;Foo, const getter&lt;Foo, FooBar&gt;&amp;, const setter&lt;Foo, FooBar&gt;&amp;&gt; foreign_key_type;

	static const bar_type bar;
	static const foo_type foo;
	static const primary_key_type primary_key;
	static const foreign_key_type foreign_key;
	static const std::string table;
};

const DBTable&lt;Foo&gt;::bar_type DBTable&lt;Foo&gt;::bar(&quot;bar&quot;, &amp;Foo::bar, &amp;Foo::bar);
const DBTable&lt;Foo&gt;::foo_type DBTable&lt;Foo&gt;::foo(&quot;foo&quot;, &amp;Foo::foo, &amp;Foo::foo);
const DBTable&lt;Foo&gt;::primary_key_type DBTable&lt;Foo&gt;::primary_key(DBTable&lt;Foo&gt;::bar, DBTable&lt;Foo&gt;::foo);
const DBTable&lt;Foo&gt;::foreign_key_type DBTable&lt;Foo&gt;::foreign_key(DBTable&lt;Foo&gt;::foobar, DBTable&lt;Foo&gt;::foobar);
const std::string DBTable&lt;Foo&gt;::table(&quot;foo&quot;);
</code></pre>
<p>Ich will dann später etwas machen wie:</p>
<pre><code class="language-cpp">entity_manager(select&lt;Foo&gt;() &lt;&lt; where(DBTable&lt;Foo&gt;::foreign_key, foobar));
</code></pre>
<p>wobei der foreign_key sich dann auf den primary_key von FooBar bezieht.</p>
<p>Ob man intern direkt nen String zusammen baut, ober erst, wenn er benötigt wird ist wohl Geschmacksache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265072</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 28 Oct 2012 19:06:32 GMT</pubDate></item></channel></rss>