<?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[rvalue reference und std::make_pair- hat der VC2012 recht?]]></title><description><![CDATA[<p>Ich bekomm gerad eienen Bugreport von jemanden rein, der VC12 verwendet und C++11 scheinbar aktiviert hat. Code der vorher problemlos funktioneirt hat, gibt jetzt einen compilefehler aus, und ich frage mich, ob ich das fixen muss, oder ob der compiler schuld ist:</p>
<p>folgender Code:</p>
<pre><code>template&lt;class Iterator1,class Iterator2&gt;
struct PairIterator{

std::pair&lt;Iterator1,Iterator2&gt; iterators()const{
    return std::make_pair&lt;Iterator1,Iterator2&gt;(m_iterator1,m_iterator2);
}
private:
	Iterator1 m_iterator1;
	Iterator2 m_iterator2;
};
</code></pre>
<p>Fehlermeldung:</p>
<pre><code>error C2664: 'std::make_pair' : cannot convert parameter 1 from 'const std::_Vector_iterator&lt;_Myvec&gt;' to 'std::_Vector_iterator&lt;_Myvec&gt; &amp;&amp;'
</code></pre>
<p>Mir ist schon irgendwie klar das const Iterator1 nicht an Iterator1&amp;&amp; binden sollte. Aber ich bin mir nicht sicher: sollte in diesem Fall nicht eine temporäre kopie erzeugt werden? Beinhaltet der Standard wirklich library änderungen die nicht rückwärtskompatibel sind? *seufz*</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317428/rvalue-reference-und-std-make_pair-hat-der-vc2012-recht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 01:19:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317428.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Jun 2013 11:39:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 11:41:29 GMT]]></title><description><![CDATA[<p>Ich bekomm gerad eienen Bugreport von jemanden rein, der VC12 verwendet und C++11 scheinbar aktiviert hat. Code der vorher problemlos funktioneirt hat, gibt jetzt einen compilefehler aus, und ich frage mich, ob ich das fixen muss, oder ob der compiler schuld ist:</p>
<p>folgender Code:</p>
<pre><code>template&lt;class Iterator1,class Iterator2&gt;
struct PairIterator{

std::pair&lt;Iterator1,Iterator2&gt; iterators()const{
    return std::make_pair&lt;Iterator1,Iterator2&gt;(m_iterator1,m_iterator2);
}
private:
	Iterator1 m_iterator1;
	Iterator2 m_iterator2;
};
</code></pre>
<p>Fehlermeldung:</p>
<pre><code>error C2664: 'std::make_pair' : cannot convert parameter 1 from 'const std::_Vector_iterator&lt;_Myvec&gt;' to 'std::_Vector_iterator&lt;_Myvec&gt; &amp;&amp;'
</code></pre>
<p>Mir ist schon irgendwie klar das const Iterator1 nicht an Iterator1&amp;&amp; binden sollte. Aber ich bin mir nicht sicher: sollte in diesem Fall nicht eine temporäre kopie erzeugt werden? Beinhaltet der Standard wirklich library änderungen die nicht rückwärtskompatibel sind? *seufz*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329364</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 08 Jun 2013 11:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 11:50:00 GMT]]></title><description><![CDATA[<p>Was passiert denn, wenn du die überflüssigen Typangaben bei <code>make_pair</code> weglässt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329367</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 08 Jun 2013 11:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 11:56:16 GMT]]></title><description><![CDATA[<p>Ich habe keinen VC12 hier, kanns also selbst nicht austesten.</p>
<p>aber nach</p>
<p><a href="http://www.cplusplus.com/reference/utility/make_pair/" rel="nofollow">http://www.cplusplus.com/reference/utility/make_pair/</a></p>
<p>ist die Signatur</p>
<pre><code>template &lt;class T1, class T2&gt;
  pair&lt;V1,V2&gt; make_pair (T1&amp;&amp; x, T2&amp;&amp; y);  // see below for definition of V1 and V2
</code></pre>
<p>also sollten meeine überflüssigen Typangaben keinen Unterschied machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329369</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 08 Jun 2013 11:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 14:18:48 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Beinhaltet der Standard wirklich library änderungen die nicht rückwärtskompatibel sind? *seufz*</p>
</blockquote>
<p>Das wäre so ein Fall, ja. Allerdings ist der Code ohnehin 100% sinnlos. Der Sinn von make_pair besteht ja gerade darin, dass die Templateargumente nicht explizit angegeben werden müssen. Andernfalls kann man das pair genausogut direkt erzeugen.</p>
<pre><code class="language-cpp">return std::pair&lt;Iterator1,Iterator2&gt;(m_iterator1,m_iterator2);
return make_pair_pair(m_iterator1,m_iterator2); // erzeugt pair&lt;const Iterator1&amp;, const Iterator2&amp;&gt; das dann nochmal implizit konvertiert wird
return {m_iterator1,m_iterator2};
</code></pre>
<p>Ein lvalue kan nicht an eine rvalue-Referenz gebunden werden. (und dann kommt noch in diesem Fall die const-Problematik hinzu).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329370</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 08 Jun 2013 14:18:48 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 12:23:12 GMT]]></title><description><![CDATA[<p>Der springende Punkt ist das reference-collapsing, was durch das explizite Angeben der Typen verhindert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329378</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 08 Jun 2013 12:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 12:25:27 GMT]]></title><description><![CDATA[<p>Um das nochmal deutlich zu sagen:</p>
<p>otze schrieb:</p>
<blockquote>
<p>Ich habe keinen VC12 hier, kanns also selbst nicht austesten.</p>
<p>aber nach</p>
<p><a href="http://www.cplusplus.com/reference/utility/make_pair/" rel="nofollow">http://www.cplusplus.com/reference/utility/make_pair/</a></p>
<p>ist die Signatur</p>
<pre><code>template &lt;class T1, class T2&gt;
  pair&lt;V1,V2&gt; make_pair (T1&amp;&amp; x, T2&amp;&amp; y);  // see below for definition of V1 and V2
</code></pre>
<p>also sollten meeine überflüssigen Typangaben keinen Unterschied machen.</p>
</blockquote>
<p>Doch, ohne die überflüssigen Typangaben sollte es korrekt funktionieren. Nur mit den Typangaben ist es inkompatibel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329381</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Sat, 08 Jun 2013 12:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 12:58:52 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Der springende Punkt ist das reference-collapsing, was durch das explizite Angeben der Typen verhindert wird.</p>
</blockquote>
<p>Nein. Der springende Punkt ist dass die explizite Angeben der Typen verhindert dass <code>T1</code> als <code>XYZ const</code> deduziert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329389</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 08 Jun 2013 12:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 13:42:01 GMT]]></title><description><![CDATA[<p>Danke. Nach campers post (Möglichkeit Nr.2 im Code) wars dann aber bereits klar :-). Trotzdem danke für die restlichen Mühen die mir das nochmal tiefer einhämmern sollten. Die Message ist angekommen <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/2329395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329395</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 08 Jun 2013 13:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 19:04:51 GMT]]></title><description><![CDATA[<p>Ich zitiere mal nur sinngemäß:</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// erzeugt pair&lt;const Iterator1&amp;, const Iterator2&amp;&gt; das dann nochmal implizit konvertiert wird
return make_pair(m_iterator1,m_iterator2);
</code></pre>
</blockquote>
<p>Das ist falsch. <code>make_pair</code> liefert nur dann ein Paar mit Referenz-Elementen zurück, falls man es entsprechend mit <code>reference_wrapper</code> n füttert.</p>
<p>Aber ja, der Sinn von make_pair ist schon der, dass man die Typen nicht angeben muss. Sonst könnte man auch direkt pair schreiben. <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>
<p>Sone hat schon recht. Durch explizite Angabe der Templateargumente wurden aus den Funktionsparametern Rvalue-Referenzen-auf-non-const, welche sich ja nicht mit Lvalues und schon gar nicht mit konstanten Lvalues initialisieren lassen. Es wurde sozusagen perfect forwarding ausgehebelt. Die Templateparameter beschreiben nicht die Ausgabe, sondern die Eingabe einschließlich der Wertkategorie. Der Typ der Ausgabe ist etwas komplizierter. Ggf wird da auch ein reference_wrapper zu einer normalen Referenz ausgepackt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329445</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 08 Jun 2013 19:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to rvalue reference und std::make_pair- hat der VC2012 recht? on Sat, 08 Jun 2013 19:11:28 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das ist falsch. <code>make_pair</code> liefert nur dann ein Paar mit Referenz-Elementen zurück, falls man es entsprechend mit <code>reference_wrapper</code> n füttert.</p>
</blockquote>
<p>Stimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329446</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 08 Jun 2013 19:11:28 GMT</pubDate></item></channel></rss>