<?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[Visual C++ Compiler erzeugt kein Temporary. Bug?]]></title><description><![CDATA[<p>Hallo,<br />
aufgrund dieses <a href="http://www.c-plusplus.net/forum/305483" rel="nofollow">Threads</a> bzw. meines dortigen Posts ist mir aufgefallen, dass der Visual C++ Compiler kein Temporary bei <code>int(vec.front())</code> erzeugt, was mich irgendwie stutzig gemacht hat. Deswegen hab ich mal ein neues Beispiel gemacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int i = 5;

void fkt(const int&amp; ref)
{
	cout &lt;&lt; '\n' &lt;&lt; &quot;Adresse des Temporary: &quot; &lt;&lt; &amp;ref;

	cout &lt;&lt; '\n' &lt;&lt; &quot;Wert des Temporary: &quot; &lt;&lt; ref;
	i = 10;
	cout &lt;&lt; '\n' &lt;&lt; &quot;Wert des Temporary: &quot; &lt;&lt; ref;
}

int main()
{
	cout &lt;&lt; '\n' &lt;&lt; &quot;Adresse von i        : &quot; &lt;&lt; &amp;i;

	fkt( int(i) );
}
</code></pre>
<p>Visual C++ Compiler:</p>
<pre><code>Adresse von i        : 00CF3000
Adresse des Temporary: 00CF3000
Wert des Temporary: 5
Wert des Temporary: 10
</code></pre>
<p>GCC:</p>
<pre><code>Adresse von i        : 0x470000
Adresse des Temporary: 0x28ff1c
Wert des Temporary: 5
Wert des Temporary: 5
</code></pre>
<p>Fazit:<br />
- Visual C++ Compiler erzeugt bei <code>int(i)</code> kein Temporary und die Funktion <code>fkt</code> arbeitet mit dem globalen <code>i</code> .<br />
- GCC erzeugt bei <code>int(i)</code> ein Temporary (genauso, wie es sich gehört) und die Funktion <code>fkt</code> arbeitet mit einer Kopie des globalen <code>i</code> .</p>
<p>Wieder mal ein Bug des Visual C++ Compilers, oder was sagt ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305488/visual-c-compiler-erzeugt-kein-temporary-bug</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 19:02:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305488.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jun 2012 13:45:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 13:49:37 GMT]]></title><description><![CDATA[<p>Hallo,<br />
aufgrund dieses <a href="http://www.c-plusplus.net/forum/305483" rel="nofollow">Threads</a> bzw. meines dortigen Posts ist mir aufgefallen, dass der Visual C++ Compiler kein Temporary bei <code>int(vec.front())</code> erzeugt, was mich irgendwie stutzig gemacht hat. Deswegen hab ich mal ein neues Beispiel gemacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int i = 5;

void fkt(const int&amp; ref)
{
	cout &lt;&lt; '\n' &lt;&lt; &quot;Adresse des Temporary: &quot; &lt;&lt; &amp;ref;

	cout &lt;&lt; '\n' &lt;&lt; &quot;Wert des Temporary: &quot; &lt;&lt; ref;
	i = 10;
	cout &lt;&lt; '\n' &lt;&lt; &quot;Wert des Temporary: &quot; &lt;&lt; ref;
}

int main()
{
	cout &lt;&lt; '\n' &lt;&lt; &quot;Adresse von i        : &quot; &lt;&lt; &amp;i;

	fkt( int(i) );
}
</code></pre>
<p>Visual C++ Compiler:</p>
<pre><code>Adresse von i        : 00CF3000
Adresse des Temporary: 00CF3000
Wert des Temporary: 5
Wert des Temporary: 10
</code></pre>
<p>GCC:</p>
<pre><code>Adresse von i        : 0x470000
Adresse des Temporary: 0x28ff1c
Wert des Temporary: 5
Wert des Temporary: 5
</code></pre>
<p>Fazit:<br />
- Visual C++ Compiler erzeugt bei <code>int(i)</code> kein Temporary und die Funktion <code>fkt</code> arbeitet mit dem globalen <code>i</code> .<br />
- GCC erzeugt bei <code>int(i)</code> ein Temporary (genauso, wie es sich gehört) und die Funktion <code>fkt</code> arbeitet mit einer Kopie des globalen <code>i</code> .</p>
<p>Wieder mal ein Bug des Visual C++ Compilers, oder was sagt ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228678</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2012 13:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 13:52:35 GMT]]></title><description><![CDATA[<p>Und wo soll da jetzt der Bug sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228680</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Sat, 30 Jun 2012 13:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 13:56:08 GMT]]></title><description><![CDATA[<p>SG1 schrieb:</p>
<blockquote>
<p>Und wo soll da jetzt der Bug sein?</p>
</blockquote>
<p>Dass der eine Compiler bei <code>int(i)</code> ein temporäres Objekt erzeugt, und der andere nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228681</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2012 13:56:08 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 13:59:57 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>SG1 schrieb:</p>
<blockquote>
<p>Und wo soll da jetzt der Bug sein?</p>
</blockquote>
<p>Dass der eine Compiler bei <code>int(i)</code> ein temporäres Objekt erzeugt, und der andere nicht.</p>
</blockquote>
<p>Könnte der Compiler das Optimiert haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228682</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 13:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 13:59:12 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>SG1 schrieb:</p>
<blockquote>
<p>Und wo soll da jetzt der Bug sein?</p>
</blockquote>
<p>Dass der eine Compiler bei <code>int(i)</code> ein temporäres Objekt erzeugt, und der andere nicht.</p>
</blockquote>
<p>Könnte der Compiler das Optimiert haben?</p>
</blockquote>
<p>Ich habe mit VS 2010 im Debug-Modus kompiliert. Da ist die Optimierung ja deaktiviert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228683</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2012 13:59:12 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:00:13 GMT]]></title><description><![CDATA[<p>Und was kommt bei dir bei dem hier raus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void func(int&amp;&amp; a)
{
        std::cout &lt;&lt; &quot;RVAL&quot;;
}

void func(int const&amp; a)
{
        std::cout &lt;&lt; &quot;REF&quot;;
}

int i(5);

int main()
{
        func( int(i) );
}
</code></pre>
<p>GCC 4.6.2 sagt RVAL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228684</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:00:13 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:05:31 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>SG1 schrieb:</p>
<blockquote>
<p>Und wo soll da jetzt der Bug sein?</p>
</blockquote>
<p>Dass der eine Compiler bei <code>int(i)</code> ein temporäres Objekt erzeugt, und der andere nicht.</p>
</blockquote>
<p>int(i) erzeugt kein temporäres Objekt, ist allerdings ein prvalue.<br />
Wenn ein solches skalares prvalue an eine Referenz gebunden wird, muss ein temporary erzeugt werden (schließlich verweist jede Referenz auf ein Objekt und ein skalares rvalue ist kein Objekt). vc++ tut das offenbar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228686</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:05:31 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:04:23 GMT]]></title><description><![CDATA[<p>Und was soll das beweisen? Der Standard sagt, dass RVAL rauskommen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228687</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:26:29 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>SG1 schrieb:</p>
<blockquote>
<p>Und wo soll da jetzt der Bug sein?</p>
</blockquote>
<p>Dass der eine Compiler bei <code>int(i)</code> ein temporäres Objekt erzeugt, und der andere nicht.</p>
</blockquote>
<p>int(i) erzeugt kein temporäres Objekt, ist allerdings ein prvalue.<br />
Wenn ein solches skalares prvalue an eine Referenz gebunden wird, muss ein temporary erzeugt werden (schließlich verweist jede Referenz auf ein Objekt und ein skalares rvalue ist kein Objekt). vc++ tut das offenbar nicht.</p>
</blockquote>
<p>Sollte ich MS den Bug melden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228694</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:26:29 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:33:44 GMT]]></title><description><![CDATA[<p>Wie konnte der Bug jahrelang verborgen bleiben?</p>
<p>Was für ein Fundstück!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228696</guid><dc:creator><![CDATA[looool @ ms]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:49:02 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Wenn ein solches skalares prvalue an eine Referenz gebunden wird, muss ein temporary erzeugt werden (schließlich verweist jede Referenz auf ein Objekt und ein skalares rvalue ist kein Objekt).</p>
</blockquote>
<p>Fällt das nicht unter as-if?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228701</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:49:02 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 14:54:04 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Fällt das nicht unter as-if?</p>
</blockquote>
<p>Solange sich das beobachtete Verhalten nicht ändert. i und das temporäre Objekt sind verschieden, haben aber eine sich überschneidene Lebensdauer.. Also müssen auch deren Adressen verschieden sein. Mit vc++ ist etwas anderes zu beobachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228705</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 30 Jun 2012 14:54:04 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Sat, 30 Jun 2012 15:31:15 GMT]]></title><description><![CDATA[<p>Anscheinend ist es trotzdem eine Art Optimierung, auch wenn Optimierungen deaktiviert sind.</p>
<p>Konventiert man zum Beispiel zu short, so funktioniert alles wieder:</p>
<pre><code class="language-cpp">//...
int main()
{
    cout &lt;&lt; '\n' &lt;&lt; &quot;Adresse von i        : &quot; &lt;&lt; &amp;i;

    fkt( short(i) );

	cin.get();
}
</code></pre>
<pre><code>Adresse von i        : 00419000
Adresse des Temporary: 0012FEA0
Wert des Temporary: 5
Wert des Temporary: 5
</code></pre>
<p>Wenn ich <code>i</code> als <code>short</code> deklariere und dann wie im Ausganspost <code>fkt(int(i));</code> aufrufe, funktioniert es auch noch:</p>
<pre><code>Adresse von i        : 00419000
Adresse des Temporary: 0012FEA0
Wert des Temporary: 5
Wert des Temporary: 5
</code></pre>
<p>Wenn ich <code>i</code> als <code>short</code> deklariere und den geänderten Aufruf <code>fkt( short(i));</code> benutze, dann funktioniert es trotzdem: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<pre><code>Adresse von i        : 00419000
Adresse des Temporary: 0012FEA0
Wert des Temporary: 5
Wert des Temporary: 5
</code></pre>
<p>Wenn ich die Veränderungen wie gerade eben lasse und zusätzlich die Funktionissignatur von fkt nach <code>void fkt( const short&amp; ref)</code> abändere, findet sich wieder der Bug:</p>
<pre><code>Adresse von i        : 00419000
Adresse des Temporary: 00419000
Wert des Temporary: 5
Wert des Temporary: 10
</code></pre>
<p>Fazit: Ist anscheinend eine gut gemeinte Optimierung des Compilers, die auch bei abgeschalteter Optimierung wirkt, wenn Typ der Variable, des gewünschten temporären Objekts und des Funktionsargumentes gleich sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228711</guid><dc:creator><![CDATA[Jonas OSDever]]></dc:creator><pubDate>Sat, 30 Jun 2012 15:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Tue, 03 Jul 2012 07:33:15 GMT]]></title><description><![CDATA[<p>Ich habe eben versucht den Bug zu <a href="https://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=27774" rel="nofollow">melden</a>. Will ich einen Thread bei denen im Forum erstellen, bekomme ich aber immer den Fehler &quot;unexpected error&quot;. Falls jemand Lust hat, kann derjenige es ja mal versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229548</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 03 Jul 2012 07:33:15 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Tue, 03 Jul 2012 15:21:16 GMT]]></title><description><![CDATA[<p>Language-Extensions deaktiviert?<br />
MSVC erlaubt mit Extensions (die per Default an sind) das Binden von (LValue) Referenzen an RValues. Zumindest bis MSVC 2008, wird bei 2010 dann vermutlich nicht anders sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229701</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Jul 2012 15:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Tue, 03 Jul 2012 16:00:50 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Language-Extensions deaktiviert?<br />
MSVC erlaubt mit Extensions (die per Default an sind) das Binden von (LValue) Referenzen an RValues. Zumindest bis MSVC 2008, wird bei 2010 dann vermutlich nicht anders sein.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> Du hast Recht.<br />
Wenn ich Language-Extensions deaktiviere (Konfigurationseigenschaften --&gt; C/C++ --&gt; Sprache --&gt; Spracherweiterungen deaktivieren = Ja(/Za)) ist alles wieder standardkonform.</p>
<p>Danke für den Hinweis, hustbaer. <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/2229711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229711</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 03 Jul 2012 16:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Tue, 03 Jul 2012 16:20:46 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Wenn ich Language-Extensions deaktiviere (Konfigurationseigenschaften --&gt; C/C++ --&gt; Sprache --&gt; Spracherweiterungen deaktivieren = Ja(/Za)) ist alles wieder standardkonform.</p>
</blockquote>
<p>Na super, jetzt spruckt er wegen boost lauter Warnungen aus, weil<a href="http://boost.2283326.n4.nabble.com/Boost-String-Algo-Compilation-failure-td3681758.html" rel="nofollow"> <code>/Za</code> </a>offensichtlich broken ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Das ist doch eine Scheiße. MS raubt mir auch noch den letzten Nerv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229715</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 03 Jul 2012 16:20:46 GMT</pubDate></item><item><title><![CDATA[Reply to Visual C++ Compiler erzeugt kein Temporary. Bug? on Tue, 03 Jul 2012 18:01:16 GMT]]></title><description><![CDATA[<p>Auf jeden Fall kannst du dir jetzt sparen den &quot;Bug&quot; zu reporten - ist schliesslich dokumentiertes und &quot;erwünschtes&quot; Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229742</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Jul 2012 18:01:16 GMT</pubDate></item></channel></rss>