<?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[Sinn von std::make_pair]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich verstehe den Sinn dieser Funktion nicht.<br />
Warum ruft man nicht einfach den Konstruktor von std:pair auf?</p>
<p>Gruß,<br />
*Cpp-Anfänger*</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193893/sinn-von-std-make_pair</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 07:28:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193893.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Oct 2007 12:45:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 12:45:24 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich verstehe den Sinn dieser Funktion nicht.<br />
Warum ruft man nicht einfach den Konstruktor von std:pair auf?</p>
<p>Gruß,<br />
*Cpp-Anfänger*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375937</guid><dc:creator><![CDATA[*Cpp-Anfänger* 0]]></dc:creator><pubDate>Mon, 01 Oct 2007 12:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 12:48:27 GMT]]></title><description><![CDATA[<p>Ein &quot;Bild&quot; sagt mehr als tausend Worte:</p>
<pre><code class="language-cpp">return make_pair( &quot;Hallo, Welt&quot;, begin() )
</code></pre>
<p>vs.</p>
<pre><code class="language-cpp">return std::pair&lt; std::basic_string&lt; char &gt; const, std::vector&lt; int &gt;::const_iterator &gt;( &quot;Hallo, Welt&quot;, begin() )
</code></pre>
<p>Ist jetzt mit Absicht etwas überzogen, aber ich denke der Sinn wird klar <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/1375939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375939</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 01 Oct 2007 12:48:27 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 12:52:59 GMT]]></title><description><![CDATA[<p>Und falls nicht, nochmal in Worten: Den pair-Ctor mußt du komplett inklusive Template-Parametern angeben, make_pair() ist eine Funktion und da kann der Compiler selber die Template-Parameter bestimmen.</p>
<p>(daß LordJaxom's erstes Beispiel ein std::pair&lt;char*,int&gt; zurückgibt, stört übrigens nicht weiter - alle pair's sind weitgehend zueinander kompatibel ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375943</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 01 Oct 2007 12:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 12:57:17 GMT]]></title><description><![CDATA[<p>std::make_pair() kann die angabe der template-parameter umgehen. Stell dir vor, du hast irgendein Funktionstemplate, das ein Pair aus den beiden Templateparametern erwartet:</p>
<pre><code class="language-cpp">template &lt;class A, class B&gt;
void foo(std::pair&lt;A,B&gt; mypair);
</code></pre>
<p>Und dieser Funktion willst du jetzt ein pair uebergeben aus zwei Variablen die du irgendwo herhast:</p>
<pre><code class="language-cpp">std::map&lt;std::vector&lt;int&gt;::size_t, mynamespace::superclasscontainer::iterator&gt; mymap;
std::basic_string&lt;funnynamespace::funnychar&gt; mystring;
</code></pre>
<p>(hab mir da mal extra lange Klassennamen ausgedacht um den Vorteil zu verduetlichen, ich weiss dass man da typedefs nutzen kann...)</p>
<p>dafuer gibts jetzt zwei Arten des Aufrufs von foo:</p>
<pre><code class="language-cpp">foo(pair&lt;std::map&lt;std::vector&lt;int&gt;::size_t, mynamespace::superclasscontainer::iterator&gt;, std::basic_string&lt;funnynamespace::funnychar&gt; &gt;(mymap, mystring)); //angabe der templateparameter von pair
foo(make_pair(mymap, mystring)); //makepair erkennt den typ der templateparameter anhand seiner argumente
</code></pre>
<p>/edit: grml wiedermal zu lahm</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375947</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2007 12:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 12:58:30 GMT]]></title><description><![CDATA[<p>Warum kann man dann nicht einen Konstruktor schreiben, der wie make_pair funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375950</guid><dc:creator><![CDATA[hmmmm]]></dc:creator><pubDate>Mon, 01 Oct 2007 12:58:30 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:02:45 GMT]]></title><description><![CDATA[<p>Wurde doch schon gesagt dass das beim normalen CTor nicht geht:</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Den pair-Ctor mußt du komplett inklusive Template-Parametern angeben,</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1375955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375955</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:03:41 GMT]]></title><description><![CDATA[<p>Weil bei der Angabe von Template-Typen die Parameter nicht automatisch erkannt werden können. (make_pair() und ähnliche Funktionen wurden eingeführt, um genau diese Lücke zu schließen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375956</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:13:31 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Weil bei der Angabe von Template-Typen die Parameter nicht automatisch erkannt werden können. (make_pair() und ähnliche Funktionen wurden eingeführt, um genau diese Lücke zu schließen)</p>
</blockquote>
<p>Warum kann es dann bei make_pair erkannt werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375964</guid><dc:creator><![CDATA[hmmmm]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:15:35 GMT]]></title><description><![CDATA[<p>make_pair() ist eine Funktion - und für Funktionen gelten etwas andere Regeln als für Klassen (insbesondere kann der Compiler aus den Funktionsparametern (meist) die benötigten Typen herleiten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375966</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:16:26 GMT]]></title><description><![CDATA[<p>Vielen Dank!</p>
<p>Klingt logisch ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375968</guid><dc:creator><![CDATA[*Cpp-Anfänger* 0]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:38:09 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>make_pair() ist eine Funktion - und für Funktionen gelten etwas andere Regeln als für Klassen (insbesondere kann der Compiler aus den Funktionsparametern (meist) die benötigten Typen herleiten).</p>
</blockquote>
<p>Naja, so ganz versteh ich es nicht. make_pair bekommt es ja hin, dass ein richtiges Objekt erzeugt wird. Wieso der Compiler jetzt die Typen bei Konstruktoren nicht herleiten kann, muss wohl in den Tiefen von C++ vergraben sein.</p>
<pre><code class="language-cpp">std::make_pair&lt;int, int&gt;(1,3);
std::make_pair(1,3);
std::pair&lt;int, int&gt; rr1(1,3);
std::pair rr2(1,3); //Warum nicht, die Info ist doch genauso vorhanden wie beim zweiten make_pair?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1375985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375985</guid><dc:creator><![CDATA[hmmmm]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:38:09 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:47:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7466">@hmm</a>: Du siehst das zu oberflächlich - bei Template-Klassen muß der exakte Typ angegeben werden, um eine Variable anlegen zu können (std::pair ist kein Typ, sondern eine Vorlage für viele mögliche Typen). Bei Template-Funktionen spart es Schreibarbeit, wenn man nicht immer die ellenlangen Typangaben angeben muß (und vermindert Redundanzen), aber bei Klassen war das nicht nötig.</p>
<p>(btw, irgendwo habe ich auch etwas von auto gelesen, um den richtigen Typ für eine Variable automatisch ermitteln zu lassen - afair eine Erweiterung für die nächste Standardversion)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1375990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1375990</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 13:59:45 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>... aber bei Klassen war das nicht nötig.</p>
</blockquote>
<p>Soll heißen, es würde eigentlich gehen, aber keiner wollte es, also hat man es nicht gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376000</guid><dc:creator><![CDATA[hmmmm]]></dc:creator><pubDate>Mon, 01 Oct 2007 13:59:45 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 14:03:57 GMT]]></title><description><![CDATA[<p>Nein, bei Klassen mußt du sowieso die Parameter angeben, da kommst du nicht drum herum. Und für die wenigen Fälle, wo du ein anonymes Objekt anlegen willst, gibt es Pseudo-Konstruktoren wie make_pair().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376005</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 01 Oct 2007 14:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 14:20:34 GMT]]></title><description><![CDATA[<p>Wie soll das auch bei Klassen gehen??? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">template&lt;class T, class K&gt;
class Dummy
{
   T t1;
   K k1;
};

Dummy d;   // öhm, und t1 und k1 sind vom Typ???
</code></pre>
<p>Der Bezug zu den Typen IN der Klasse fehlt ja total. Ich muß irgendwie mitteilen, wie die Typen sind. Das kann der Compiler anhand der Informationen in Zeile 8 garnicht feststellen.</p>
<p>Bei einer Funktion, kann der Compiler das anhand der Parameter feststellen, weil ich die gezwungenermaßen übergeben muß. Das liegt irgendwie in der Natür der Sache.</p>
<pre><code class="language-cpp">template&lt;class T, class K&gt;
void foo(T t1, K k1)
{
    // mach irgendwas mit t1 und k1...
}

foo(123, 456);  // sind Ints, und somit ist alles für den Compiler bekannt.
</code></pre>
<p>in foo arbeite ich mit Daten die mir der User übergibt. Und daraus kann der Compiler den Typ feststellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376021</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 01 Oct 2007 14:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 14:33:17 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>EDIT: Artchi war schneller, aber ein wenig mehr habe ich schon gesagt:</p>
<p>sagen wir einfach mal so: Bei Funktionsaufrufen hast Du implizit Typangaben (über die Parameter), die der Compiler verwenden kann -- bei Klassen nicht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class myClass {
   T t;
};

template &lt;typename T&gt;
void f(T t);

int main() {
   myClass a;
   // was soll der Compiler hier als T annehmen ?

   f(3); // Hier ist's klar: T =&gt; int
</code></pre>
<p>Deswegen hat ein Compiler auch Probleme mit Funktionen, bei denen er das T nicht auflösen kann wie:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void f() {
   T t;
};
</code></pre>
<p>Aber ein wenig muss ich schon zustimmen: Man <em>hätte</em> den Compiler noch auf Sonderfälle testen lassen wie:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class myClass {
   T t;
public:
   myClass(T);
};

int main() {
   myClass a(3);
   // Hier könnte der Compiler annehmen, dass man ein myClass&lt;int&gt; haben möchte
</code></pre>
<p>... aber das hätte wiederum andere häßliche Probleme erzeugt, wie</p>
<pre><code class="language-cpp">myClass a(3), b('x'), c(3.4); // haben alle unterschiedlichen Typ !
</code></pre>
<p>Vermutlich sind die Komplikationen so einer Regelungen den Aufwand an Sonderregeln und Compilerbau (die ich mir immens vorstelle) nicht wert.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376028</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 01 Oct 2007 14:33:17 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 14:40:20 GMT]]></title><description><![CDATA[<blockquote>
<p>Vermutlich sind die Komplikationen so einer Regelungen den Aufwand an Sonderregeln und Compilerbau (die ich mir immens vorstelle) nicht wert.</p>
</blockquote>
<p>Richtig! Wenn man die Postings des C++-Komitees verfolgt, wird man feststellen, das diese sehr gerne vieles &quot;automatisieren&quot; würden, aber die Komplexität für die Implementierung durch die Compiler-Hersteller das nicht gerechfertigt. Die würden auf die Barikaden gehen und dann können wir lange auf einen C++-konformen Compiler warten. <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/1376048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376048</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Mon, 01 Oct 2007 14:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Mon, 01 Oct 2007 16:50:58 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber ein wenig muss ich schon zustimmen: Man <em>hätte</em> den Compiler noch auf Sonderfälle testen lassen wie:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class myClass {
   T t;
public:
   myClass(T);
};

int main() {
   myClass a(3);
   // Hier könnte der Compiler annehmen, dass man ein myClass&lt;int&gt; haben möchte
</code></pre>
<p>... aber das hätte wiederum andere häßliche Probleme erzeugt, wie</p>
<pre><code class="language-cpp">myClass a(3), b('x'), c(3.4); // haben alle unterschiedlichen Typ !
</code></pre>
<p>Vermutlich sind die Komplikationen so einer Regelungen den Aufwand an Sonderregeln und Compilerbau (die ich mir immens vorstelle) nicht wert.</p>
</blockquote>
<p>genau das mein ich mit &quot;es würde eigentlich gehen, aber keiner wollte es&quot;. Wobei &quot;wollen&quot; nicht ganz stimmt, sondern der Nutzen einfach nicht so groß wäre im Vergleich zum Aufwand. Man kann es ja jetzt fast genauso mit Funktionen lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376123</guid><dc:creator><![CDATA[hmmmm]]></dc:creator><pubDate>Mon, 01 Oct 2007 16:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Sinn von std::make_pair on Tue, 02 Oct 2007 07:58:19 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>...die Komplexität für die Implementierung durch die Compiler-Hersteller das nicht gerechfertigt. Die würden auf die Barikaden gehen und dann können wir lange auf einen C++-konformen Compiler warten. <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>hmmmm schrieb:</p>
<blockquote>
<p>...sondern der Nutzen einfach nicht so groß wäre im Vergleich zum Aufwand. Man kann es ja jetzt fast genauso mit Funktionen lösen.</p>
</blockquote>
<p>Wobei es mir nicht nur (aber auch) um den Aufwand der Compilerhersteller ging, sondern auch um die &quot;Komplexität im Regelwerk&quot;. Wenn man sich mal ansieht wie oft/regelmäßig hier das hier auftaucht:</p>
<pre><code class="language-cpp">myClass meinObjekt1(&quot;Simon2&quot;), meinObjekt2(), meinObjekt2(7);
</code></pre>
<p>... dann will ich nicht wissen, wie viele Fehler eine &quot;implizite template-class-deduction&quot; verursacht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1376329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1376329</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 02 Oct 2007 07:58:19 GMT</pubDate></item></channel></rss>