<?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[Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide]]></title><description><![CDATA[<p>Hallo allerseits,<br />
ich fange gerade an das Buch &quot;C++ Templates: The Complete Guide&quot; zu lesen. Im Kapitel zur Überladung von Funktionstemplates gibt es ein Beispiel, bei dem ich nicht weiß, ob ich das richtig verstanden habe:</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;cstring&gt; 
#include &lt;string&gt; 

// maximum of two values of any type (call-by-reference) 
template &lt;typename T&gt; 
inline T const&amp; max (T const&amp; a, T const&amp; b) 
{ 
    return a &lt; b ? b : a; 
} 

// maximum of two C-strings (call-by-value) 
inline char const* max (char const* a, char const* b) 
{ 
    return std::strcmp(a,b) &lt; 0 ? b : a; 
} 

// maximum of three values of any type (call-by-reference) 
template &lt;typename T&gt; 
inline T const&amp; max (T const&amp; a, T const&amp; b, T const&amp; c) 
{ 
    return max (max(a,b), c); // error, if max(a,b) uses call-by-value 
} 

int main () 
{ 
    ::max(7, 42, 68); // OK 

    const char* s1 = &quot;frederic&quot;; 
    const char* s2 = &quot;anica&quot;; 
    const char* s3 = &quot;lucas&quot;; 

   ::max(s1, s2, s3); // ERROR 
}
</code></pre>
<p>Kompiliert mit folgender Warnung:</p>
<pre><code>returning address of local variable or temporary
</code></pre>
<p>Kurz zur Benennung: das max mit den 2 Parametern nenne ich mal max2, das mit den 3 Parametern max3.<br />
So wie ich das vertanden habe, wird erst max3 initialisiert. Das &quot;T&quot; ist dabei &quot;char*&quot;. Da es eine Nicht-Template Funktion gibt, die &quot;const char*&quot; erwartet, wird diese Funktion für max2 Variante gewählt und die templateversion von max2 garnicht erst initialisiert. Beim Aufruf von max3 werden die Zeiger als Referenz übergeben. max2 erwartet aber eine Kopie, also werden die Zeiger, die als Refernz an max3 weitergegeben wurden, in die lokalen Variablen von max2 kopiert. Der Rückgabewert von max2 ist eine Kopie der lokalen Variable von max2. max3 möchte aber eine Referenz darauf zurückgeben, wodurch eine Referenz auf eine lokale Variable entstehen würde.<br />
Ist das so richtig, oder liege ich völlig daneben? <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316651/kurze-frage-zu-beispiel-aus-c-templates-the-complete-guide</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 17:25:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316651.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 May 2013 17:38:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sat, 11 May 2013 17:38:21 GMT]]></title><description><![CDATA[<p>Hallo allerseits,<br />
ich fange gerade an das Buch &quot;C++ Templates: The Complete Guide&quot; zu lesen. Im Kapitel zur Überladung von Funktionstemplates gibt es ein Beispiel, bei dem ich nicht weiß, ob ich das richtig verstanden habe:</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;cstring&gt; 
#include &lt;string&gt; 

// maximum of two values of any type (call-by-reference) 
template &lt;typename T&gt; 
inline T const&amp; max (T const&amp; a, T const&amp; b) 
{ 
    return a &lt; b ? b : a; 
} 

// maximum of two C-strings (call-by-value) 
inline char const* max (char const* a, char const* b) 
{ 
    return std::strcmp(a,b) &lt; 0 ? b : a; 
} 

// maximum of three values of any type (call-by-reference) 
template &lt;typename T&gt; 
inline T const&amp; max (T const&amp; a, T const&amp; b, T const&amp; c) 
{ 
    return max (max(a,b), c); // error, if max(a,b) uses call-by-value 
} 

int main () 
{ 
    ::max(7, 42, 68); // OK 

    const char* s1 = &quot;frederic&quot;; 
    const char* s2 = &quot;anica&quot;; 
    const char* s3 = &quot;lucas&quot;; 

   ::max(s1, s2, s3); // ERROR 
}
</code></pre>
<p>Kompiliert mit folgender Warnung:</p>
<pre><code>returning address of local variable or temporary
</code></pre>
<p>Kurz zur Benennung: das max mit den 2 Parametern nenne ich mal max2, das mit den 3 Parametern max3.<br />
So wie ich das vertanden habe, wird erst max3 initialisiert. Das &quot;T&quot; ist dabei &quot;char*&quot;. Da es eine Nicht-Template Funktion gibt, die &quot;const char*&quot; erwartet, wird diese Funktion für max2 Variante gewählt und die templateversion von max2 garnicht erst initialisiert. Beim Aufruf von max3 werden die Zeiger als Referenz übergeben. max2 erwartet aber eine Kopie, also werden die Zeiger, die als Refernz an max3 weitergegeben wurden, in die lokalen Variablen von max2 kopiert. Der Rückgabewert von max2 ist eine Kopie der lokalen Variable von max2. max3 möchte aber eine Referenz darauf zurückgeben, wodurch eine Referenz auf eine lokale Variable entstehen würde.<br />
Ist das so richtig, oder liege ich völlig daneben? <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322684</guid><dc:creator><![CDATA[TMPAnfänger]]></dc:creator><pubDate>Sat, 11 May 2013 17:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sat, 11 May 2013 18:05:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Der Rückgabewert von max2 ist eine Kopie der lokalen Variable von max2. max3 möchte aber eine Referenz darauf zurückgeben, wodurch eine Referenz auf eine lokale Variable entstehen würde.</p>
</blockquote>
<p>Jup, genau.</p>
<blockquote>
<p>Beim Aufruf von max3 werden die Zeiger als Referenz übergeben.</p>
</blockquote>
<p>Jo.</p>
<blockquote>
<p>Das &quot;T&quot; ist dabei &quot;char*&quot;.</p>
</blockquote>
<p>Nope, das T ist <code>char const*</code> .<br />
Wie kommst du darauf?</p>
<p>Zu den Begrifflichkeiten: Du meinst instantiiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322689</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 11 May 2013 18:05:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sat, 11 May 2013 18:10:12 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Das &quot;T&quot; ist dabei &quot;char*&quot;.</p>
</blockquote>
<p>Nope, das T ist <code>char const*</code> .<br />
Wie kommst du darauf?</p>
<p>Zu den Begrifflichkeiten: Du meinst instantiiert.</p>
</blockquote>
<p>Da, du hast bei beiden Punkten vollkommen recht. Wenn das sonst so stimmt, dann bin ich ja ganz zufrieden :&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322690</guid><dc:creator><![CDATA[TMPAnfänger]]></dc:creator><pubDate>Sat, 11 May 2013 18:10:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sat, 11 May 2013 18:22:51 GMT]]></title><description><![CDATA[<p>TMPAnfänger schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Das &quot;T&quot; ist dabei &quot;char*&quot;.</p>
</blockquote>
<p>Nope, das T ist <code>char const*</code> .<br />
Wie kommst du darauf?</p>
<p>Zu den Begrifflichkeiten: Du meinst instantiiert.</p>
</blockquote>
<p>Da, du hast bei beiden Punkten vollkommen recht. Wenn das sonst so stimmt, dann bin ich ja ganz zufrieden :&gt;</p>
</blockquote>
<p>Wie ich mal in meiner Signatur stehen hatte: <em>C++-Templates - Metaquark vom feinsten.</em><br />
Ist halt alles recht kompliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322693</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 11 May 2013 18:22:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sun, 12 May 2013 09:07:51 GMT]]></title><description><![CDATA[<p>Eine Sache fällt mir noch auf:</p>
<blockquote>
<p>Da es eine Nicht-Template Funktion gibt, die &quot;const char*&quot; erwartet, wird diese Funktion für max2 Variante gewählt und die templateversion von max2 garnicht erst initialisiert.</p>
</blockquote>
<p>Das wurde in deinem Beispiel bereits instantiiert. <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>Übrigens ist es eine merkwürdige Angewohnheit, den globalen Scope-Operator zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322694</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 12 May 2013 09:07:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sun, 12 May 2013 14:06:47 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Übrigens ist es eine merkwürdige Angewohnheit, den globalen Scope-Operator zu verwenden.</p>
</blockquote>
<p>Habe ich mir auch gedacht. Im Buch wird es gemacht, damit nicht std::max verwendet wird. Falls ::max mit Typen aufgerufen wird, die im std Namespace stehen, ann sucht er nach max ja auch im std-Namespace.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322801</guid><dc:creator><![CDATA[TMPAnfänger]]></dc:creator><pubDate>Sun, 12 May 2013 14:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sun, 12 May 2013 15:29:33 GMT]]></title><description><![CDATA[<p>TMPAnfänger schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Übrigens ist es eine merkwürdige Angewohnheit, den globalen Scope-Operator zu verwenden.</p>
</blockquote>
<p>Habe ich mir auch gedacht. Im Buch wird es gemacht, damit nicht std::max verwendet wird. Falls ::max mit Typen aufgerufen wird, die im std Namespace stehen, ann sucht er nach max ja auch im std-Namespace.</p>
</blockquote>
<p><code>std::max</code> kann gar nicht gefunden werden, weil es nicht bekannt ist. <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/2322811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322811</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 12 May 2013 15:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sun, 12 May 2013 15:34:44 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>TMPAnfänger schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Übrigens ist es eine merkwürdige Angewohnheit, den globalen Scope-Operator zu verwenden.</p>
</blockquote>
<p>Habe ich mir auch gedacht. Im Buch wird es gemacht, damit nicht std::max verwendet wird. Falls ::max mit Typen aufgerufen wird, die im std Namespace stehen, ann sucht er nach max ja auch im std-Namespace.</p>
</blockquote>
<p><code>std::max</code> kann gar nicht gefunden werden, weil es nicht bekannt ist. <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>Welche Antwort hingegen hätte am meisten geholfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322813</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 12 May 2013 15:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Beispiel aus C++ Templates: The Complete Guide on Sun, 12 May 2013 16:02:20 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Welche Antwort hingegen hätte am meisten geholfen?</p>
</blockquote>
<p>Ups, ich hab die Antwort nicht komplett durchgelesen.</p>
<p>Neh, in dem Fall wäre wohl ein anderer Name adäquat. Sowas wie myMax. Dann muss man sich um so einen Quatsch keine Sorgen mehr machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2322821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2322821</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 12 May 2013 16:02:20 GMT</pubDate></item></channel></rss>