<?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[Aufruf von Templatefunktionen mit Reference Collapsing (Bug?)]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>beim Schreiben dieses Programmes (<a href="http://ideone.com/uIIPMi" rel="nofollow">http://ideone.com/uIIPMi</a>) ist mir etwas Seltsames aufgefallen.<br />
Reduziert auf das Wesentliche:</p>
<pre><code>class foo
{
public:
    foo(const int&amp;) {std::cout &lt;&lt; &quot;const int &amp;\n&quot;;}
    template &lt;typename T&gt;
    foo(T &amp;&amp;) {std::cout &lt;&lt; &quot;T &amp;&amp;\n&quot;;}
};

void bar(const int &amp;) {std::cout &lt;&lt; &quot;const int &amp;\n&quot;;}
template &lt;typename T&gt; void bar(T &amp;&amp;) {std::cout &lt;&lt; &quot;T &amp;&amp;\n&quot;;}

void foobar(const int &amp;) {std::cout &lt;&lt; &quot;const int &amp;\n&quot;;}
template &lt;typename T&gt; void foobar(T) {std::cout &lt;&lt; &quot;T\n&quot;;}

int main()
{
    foo f(5);
    bar(5);
    foobar(5);
}
</code></pre>
<p>Output:<br />
T &amp;&amp; <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="😮"
    /><br />
T &amp;&amp; <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="😮"
    /><br />
Aber:<br />
const int &amp;</p>
<p>Offenbar scheint der Compiler (GCC 4.8.1) die Templatefunktion aufzurufen, sobald Reference Collapsing im Spiel ist. Sollte es nicht immer zuerst mit einer normalen Funktion probiert werden? Steht das so im Standard?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319549/aufruf-von-templatefunktionen-mit-reference-collapsing-bug</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 05:14:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319549.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Aug 2013 18:57:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Thu, 22 Aug 2013 19:03:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>beim Schreiben dieses Programmes (<a href="http://ideone.com/uIIPMi" rel="nofollow">http://ideone.com/uIIPMi</a>) ist mir etwas Seltsames aufgefallen.<br />
Reduziert auf das Wesentliche:</p>
<pre><code>class foo
{
public:
    foo(const int&amp;) {std::cout &lt;&lt; &quot;const int &amp;\n&quot;;}
    template &lt;typename T&gt;
    foo(T &amp;&amp;) {std::cout &lt;&lt; &quot;T &amp;&amp;\n&quot;;}
};

void bar(const int &amp;) {std::cout &lt;&lt; &quot;const int &amp;\n&quot;;}
template &lt;typename T&gt; void bar(T &amp;&amp;) {std::cout &lt;&lt; &quot;T &amp;&amp;\n&quot;;}

void foobar(const int &amp;) {std::cout &lt;&lt; &quot;const int &amp;\n&quot;;}
template &lt;typename T&gt; void foobar(T) {std::cout &lt;&lt; &quot;T\n&quot;;}

int main()
{
    foo f(5);
    bar(5);
    foobar(5);
}
</code></pre>
<p>Output:<br />
T &amp;&amp; <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="😮"
    /><br />
T &amp;&amp; <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="😮"
    /><br />
Aber:<br />
const int &amp;</p>
<p>Offenbar scheint der Compiler (GCC 4.8.1) die Templatefunktion aufzurufen, sobald Reference Collapsing im Spiel ist. Sollte es nicht immer zuerst mit einer normalen Funktion probiert werden? Steht das so im Standard?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347915</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 22 Aug 2013 19:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Thu, 22 Aug 2013 19:00:06 GMT]]></title><description><![CDATA[<p>---</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347916</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 22 Aug 2013 19:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Thu, 22 Aug 2013 19:07:26 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Bug?</p>
</blockquote>
<p>lol</p>
<p>Integer-Literale sind prvalues. <code>int&amp;&amp;</code> ist ein besserer match als <code>int const&amp;</code> , deshalb wird die Template-Funktion genommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347917</guid><dc:creator><![CDATA[prrr]]></dc:creator><pubDate>Thu, 22 Aug 2013 19:07:26 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Thu, 22 Aug 2013 19:11:25 GMT]]></title><description><![CDATA[<p>Oh, ähm. Ups. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Das ist mir jetzt peinlich.<br />
Irgendwie hatte ich Integer Literale nicht als RValues auf dem Schirm.<br />
Ich sollte mehr schlafen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347919</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 22 Aug 2013 19:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 06:46:20 GMT]]></title><description><![CDATA[<p>N3337 §13.3.3.2/3 schrieb:</p>
<blockquote>
<p>Standard conversion sequence S1 is a better conversion sequence than standard conversion sequence S2 if [...] S1 and S2 are reference bindings (8.5.3) [...] and S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2347986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347986</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 23 Aug 2013 06:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 07:29:38 GMT]]></title><description><![CDATA[<p>Ja, ich brauche mehr Schlaf, aber nciht weil ich zu blöd bin 5 als RValue anzuerkennen, sondern weil ich Probleme nicht richtig reduzieren kann. <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="🙄"
    /><br />
Die main() sollte eigentlich so aussehen (also mit einem LValue als Aufruf):</p>
<pre><code>int main()
{
    int i;
    foo f(i);
    ...
}
</code></pre>
<p>Gleicher Output: <a href="http://ideone.com/Xf3qwL" rel="nofollow">http://ideone.com/Xf3qwL</a><br />
Und der überrascht mich jetzt.<br />
i ist definitiv ein LValue, also sollte auch eigentlich die const int &amp; Version aufgerufen werden...?</p>
<p>Edit: Moment, mache ich aus dem const int &amp; ein int &amp; gehts. Aber selbst wenn das so gewollt ist, ist das nicht ein bisschen - unerwartet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347993</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 23 Aug 2013 07:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 07:51:44 GMT]]></title><description><![CDATA[<p>T wird zu <code>int&amp;</code> deduziert, damit wird der Parameter zu <code>int&amp;</code> , und das passt besser.<br />
<a href="http://ideone.com/fEmYgI" rel="nofollow">http://ideone.com/fEmYgI</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347999</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 23 Aug 2013 07:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 09:01:16 GMT]]></title><description><![CDATA[<p>Danke, Sone, darauf bin ich auch selber gekommen (s. Edit). <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="🙄"
    /> <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 />
Trotzdem finde ich das seltsam, dass die Templatefunktion aufgerufen wird.<br />
imo passt da die non-Template Version mindestens genauso gut, also sollte da wenigstens eine Mehrdeutigkeit sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348020</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 23 Aug 2013 09:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 15:12:32 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Danke, Sone, darauf bin ich auch selber gekommen (s. Edit). <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="🙄"
    /> <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>?? Ich erkenne in deinem Edit nichts. Musst nicht gleich unfreundlich werden. <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>
<blockquote>
<p>imo passt da die non-Template Version mindestens genauso gut, also sollte da wenigstens eine Mehrdeutigkeit sein.</p>
</blockquote>
<p>Du findest, <code>int&amp;</code> passt bei einem lvalue nicht besser als <code>int const&amp;</code> , wobei letzeres auch die semantische Eigenschaft hat an ein rvalue gebunden werden zu können? Finde ich unintuitiv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348158</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 23 Aug 2013 15:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 15:32:37 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Danke, Sone, darauf bin ich auch selber gekommen (s. Edit). <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="🙄"
    /> <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>?? Ich erkenne in deinem Edit nichts. Musst nicht gleich unfreundlich werden. <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>
</blockquote>
<p>Sone, irgendwelche Aussagen von mir, die mit <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="😉"
    /> abgeschlossen werden, sind nciht ernst gemeint. <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 />
Und, jetzt wo ich meinen Edit nochmal gelesen habe, sehe ich, dass ich das tatsächlich nicht geschrieben habe, obwohl ich es gedacht habe.</p>
<blockquote>
<blockquote>
<p>imo passt da die non-Template Version mindestens genauso gut, also sollte da wenigstens eine Mehrdeutigkeit sein.</p>
</blockquote>
<p>Du findest, <code>int&amp;</code> passt bei einem lvalue nicht besser als <code>int const&amp;</code> , wobei letzeres auch die semantische Eigenschaft hat an ein rvalue gebunden werden zu können? Finde ich unintuitiv.</p>
</blockquote>
<p>Nee, das nicht. Sondern die Templateaufrufregeln, die offenbar besagen, dass sobald da eine Konversion stattfinden müsste, die Templatefunktion aufgerufen wird. Das finde ich nicht gut. Genauer ausgedrückt: Bei einer float zu int Konversion ist das ok, aber nicht bei einem Hinzufügen von einem const - finde ich.<br />
Naja, ist auch egal, mit enable_if konnte ich mich da rausholen (Was glaub ich auch für solche Dinge gedacht ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348164</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 23 Aug 2013 15:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Templatefunktionen mit Reference Collapsing (Bug?) on Fri, 23 Aug 2013 16:09:42 GMT]]></title><description><![CDATA[<p>Aufgrund der unter Umständen unerwarteten Resultate beim Überladen von &quot;Universal References&quot; (<a href="http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers" rel="nofollow">Scott Meyers</a>) gibt dieser als Teil seines neuen (noch nicht erschienen) Buches &quot;Effective C++11/14&quot; den Ratschlag, dies zu vermeiden</p>
<p>Er hat zu diesem Thema neulich einen Vortrag gehalten (<a href="http://scottmeyers.blogspot.de/2013/07/video-for-universal-referenceoverloadin.html" rel="nofollow">&quot;The Universal Reference/Overloading Collision Conundrum&quot;</a>). Da allerdings im Video zum Vortrag einige Fehler in den Folien stecken, würde ich empfehlen, direkt die <a href="http://nwcpp.org/talks/2013/URefs-and-Overloading-revised.pdf" rel="nofollow">korrigierte Version der Folien</a> anzusehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2348169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2348169</guid><dc:creator><![CDATA[ananas]]></dc:creator><pubDate>Fri, 23 Aug 2013 16:09:42 GMT</pubDate></item></channel></rss>