<?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[Warum using bei Template-Alias (C++0x)?]]></title><description><![CDATA[<p>Ich frage mich schon länger, warum man bei den Template-Aliases in C++0x <code>using</code> statt <code>typedef</code> als Schlüsselwort verwendet hat. In alle Quellen, die ich gefunden habe, ist nur sehr ungenau von &quot;technischen Gründen&quot; oder &quot;es ist nicht gelungen, eine konsistente Syntax zu finden&quot; die Rede.</p>
<p>Kurz und Knapp, meine Idee wäre folgende gewesen:</p>
<pre><code class="language-cpp">//statt
template&lt;class T&gt;
using Vec = std::vector&lt;T,My_alloc&lt;T&gt;&gt;;

// mit typedef
template&lt;class T&gt;
typedef std::vector&lt;T,My_alloc&lt;T&gt;&gt; Vec;
</code></pre>
<p>Natürlich bin ich mir aber sicher, dass die Leute des Kommitees darauf auch gekommen sind, die Idee aber wegen ewaiger Ungereimtheiten verworfen haben.<br />
Genau diese Ungereimtheiten interessieren mich. Ich übersehe da sicher irgendwelche Spezialfälle, bei denen diese Syntax nicht funktioniert, es wäre nett, wenn ihr mir genau diese nahelegen könntet.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269026/warum-using-bei-template-alias-c-0x</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 11:06:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269026.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Jun 2010 17:53:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 17:53:20 GMT]]></title><description><![CDATA[<p>Ich frage mich schon länger, warum man bei den Template-Aliases in C++0x <code>using</code> statt <code>typedef</code> als Schlüsselwort verwendet hat. In alle Quellen, die ich gefunden habe, ist nur sehr ungenau von &quot;technischen Gründen&quot; oder &quot;es ist nicht gelungen, eine konsistente Syntax zu finden&quot; die Rede.</p>
<p>Kurz und Knapp, meine Idee wäre folgende gewesen:</p>
<pre><code class="language-cpp">//statt
template&lt;class T&gt;
using Vec = std::vector&lt;T,My_alloc&lt;T&gt;&gt;;

// mit typedef
template&lt;class T&gt;
typedef std::vector&lt;T,My_alloc&lt;T&gt;&gt; Vec;
</code></pre>
<p>Natürlich bin ich mir aber sicher, dass die Leute des Kommitees darauf auch gekommen sind, die Idee aber wegen ewaiger Ungereimtheiten verworfen haben.<br />
Genau diese Ungereimtheiten interessieren mich. Ich übersehe da sicher irgendwelche Spezialfälle, bei denen diese Syntax nicht funktioniert, es wäre nett, wenn ihr mir genau diese nahelegen könntet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914037</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 17 Jun 2010 17:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 18:05:31 GMT]]></title><description><![CDATA[<p>och, dieses typedef is generell gewöhnungsbedürftig. ich find's gar nicht übel, dass using typedef komplett ersetzen kann jetzt:</p>
<pre><code class="language-cpp">using foo = double;
</code></pre>
<p>geht jetzt auch. Hurrah, Konsistenz! <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>
<p>Man kann auch sofort sehen, was da passiert:<br />
neuer_name = typ<br />
(bei komplizierteren Beispielen merkt man dann den Vorteil)</p>
<pre><code class="language-cpp">typedef int*(*bar)(int);
// oder
using bar = int*(*)(int);
</code></pre>
<p>Genaue Gründe kenne ich auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914042</guid><dc:creator><![CDATA[och]]></dc:creator><pubDate>Thu, 17 Jun 2010 18:05:31 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 18:43:47 GMT]]></title><description><![CDATA[<p>och schrieb:</p>
<blockquote>
<p>Hurrah, Konsistenz! <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><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>och schrieb:</p>
<blockquote>
<p>(bei komplizierteren Beispielen merkt man dann den Vorteil)</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>och schrieb:</p>
<blockquote>
<p>Genaue Gründe kenne ich auch nicht.</p>
</blockquote>
<p>Ich kann zur Not damit leben, nicht zu erfahren, warum nicht. <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="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914064</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 17 Jun 2010 18:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 19:03:42 GMT]]></title><description><![CDATA[<p>och schrieb:</p>
<blockquote>
<p>ich find's gar nicht übel, dass using typedef komplett ersetzen kann jetzt:</p>
<pre><code class="language-cpp">using foo = double;
</code></pre>
<p>geht jetzt auch. Hurrah, Konsistenz! <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>Für diverse Sprachmittel eine Alternativmöglichkeit einzuführen, obwohl die bisherigen ihren Dienst gut geleistet haben, ist nicht gerade der Inbegriff von Konsistenz. Ich glaube auch nicht, dass sich die Vision von einheitlichem Sprachmittelgebrauch durchsetzen wird. Dafür ist es in C++ zu spät. Ich befürchte eher, man könnte mit diesem Vorgehen das genaue Gegenteil erreichen, weil sich Codestile noch stärker unterscheiden werden.</p>
<p>Ich bin da grundsätzlich skeptisch. Konsistenz ist bestimmt nicht der richtige Ausdruck.</p>
<pre><code class="language-cpp">// Alles Initialisierungen für int mit Wert 5
int a(5);
int a{5};
int a = {5};
int a = 5;

std::complex&lt;float&gt; c(7); // Konstruktoraufruf mit einem Parameter
std::complex&lt;float&gt; c{7}; // Konstruktoraufruf mit einem Parameter
std::vector&lt;float&gt; v(7); // Konstruktoraufruf mit einem Parameter
std::vector&lt;float&gt; v{7}; // Initialisierungsliste mit einem Element 7
</code></pre>
<p>Soviel zur Einheitlichkeit. Funktionssyntax ist auch sowas (für Spezialfälle braucht man die neue Syntax, ja). An anderen Orten wird dafür krampfhaft recycelt und versucht, imaginäre Sprachzusammenhänge zu suggerieren.</p>
<pre><code class="language-cpp">MyClass() = default;
MyClass(const MyClass&amp;) = delete;

enum class MyEnum {};
</code></pre>
<p>Furchtbar. Was diesen Teil von C++0x betrifft, bleibt mir nicht viel mehr als <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> übrig. Zum Glück gibts Features, auf die man sich freuen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914080</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 19:15:48 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">MyClass() = default;
MyClass(const MyClass&amp;) = delete;

enum class MyEnum {};
</code></pre>
</blockquote>
<p>Ähh das Erste kannte ich...und hielt es irgendwie für sinnvoll.</p>
<p>Aber was soll bitteschön das zweite sein? //edit: bedeutet das: der copy-ctor ist nicht vorhanden?</p>
<p>Und das Dritte?</p>
<p>//edit<br />
Ich glaube das Problem bei Typedef ist, dass Typedef einen Typen beschriebt. Ein Template-alias ist aber kein Typ. Es ist nur etwas, was irgendwann mal ein Typ werden könnte. Deswegen wäre Typedef inkonsistent.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914085</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 19:20:03 GMT]]></title><description><![CDATA[<p><a href="http://www2.research.att.com/~bs/C++0xFAQ.html#default" rel="nofollow">http://www2.research.att.com/~bs/C++0xFAQ.html#default</a></p>
<p><a href="http://www2.research.att.com/~bs/C++0xFAQ.html#enum" rel="nofollow">http://www2.research.att.com/~bs/C++0xFAQ.html#enum</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914087</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 19:31:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>och schrieb:</p>
<blockquote>
<p>ich find's gar nicht übel, dass using typedef komplett ersetzen kann jetzt:</p>
<pre><code class="language-cpp">using foo = double;
</code></pre>
<p>geht jetzt auch. Hurrah, Konsistenz! <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>Für diverse Sprachmittel eine Alternativmöglichkeit einzuführen, obwohl die bisherigen ihren Dienst gut geleistet haben, ist nicht gerade der Inbegriff von Konsistenz.</p>
</blockquote>
<p>Nun, aus irgend einem technischen Grund gibt's kein templatisiertes typedef. Man hat daher diese using-Syntax benutzt. Mit Konsistenz meine ich, dass diese using-Syntax auch für &quot;normale typedefs&quot; herhalten kann.</p>
<p>Von dem initializer_list-Kram bin ich auch nicht gerade begeistert. Ich sehe da bis heute noch keine Verwendung für -- außer in kleinen (IMHO) praxisfernen Code-Beispielen wie</p>
<pre><code class="language-cpp">int main() {
  map&lt;string,string&gt; telefonbuch = {
    {&quot;Oskar&quot;, &quot;12345&quot;},
    {&quot;Wilhelm&quot;, &quot;54321&quot;}
  };
}
</code></pre>
<p>Sowas macht man halt nicht in &quot;echten&quot; PRogrammen, wo die Daten aus Dateien/Datenbanken/Internet/was weiß ich herkommen -- und nicht im Quellcode hardgecodet sind.</p>
<p>Ich muss aber auch gestehen, dass ich dieses initializer_list-Zeug noich nicht 100% verstanden habe. Ich raffe nicht, wo die Elemente gespeichert werden, wie lange die leben. Die initializer_lists scheinen auch nicht gut mit &quot;move semantic&quot; kombinierbar zu sein. Die Iteratoren liefern nämlich immer Referenzen auf const. Und dann werden die temporären Strings wie string(&quot;Oskar&quot;) und so, wohl kopiert, statt &quot;gemovet&quot;. ... (?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914093</guid><dc:creator><![CDATA[och]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 19:43:29 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Aber was soll bitteschön das zweite sein? //edit: bedeutet das: der copy-ctor ist nicht vorhanden?</p>
</blockquote>
<p>Ja. Also wie wenn man heute etwas privat und undefiniert macht, aber mit leicht besserer Compilerfehlermeldung.</p>
<p>otze schrieb:</p>
<blockquote>
<p>Und das Dritte?</p>
</blockquote>
<p>Neue <code>enum</code> s, die den umliegenden Scope nicht mehr überfluten. Mit <code>class</code> hat <code>enum class</code> rein gar nichts zu tun. <code>enum struct</code> wäre meiner Meinung nach um einiges besser gewesen, weil Struktur allgemeiner interpretierbar ist.</p>
<p>otze schrieb:</p>
<blockquote>
<p>Ich glaube das Problem bei Typedef ist, dass Typedef einen Typen beschriebt. Ein Template-alias ist aber kein Typ. Es ist nur etwas, was irgendwann mal ein Typ werden könnte. Deswegen wäre Typedef inkonsistent.</p>
</blockquote>
<p>Danke, das scheint mir ein plausibler Grund zu sein. Dann kann ich die Entscheidung schon ein wenig besser nachvollziehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914105</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Jun 2010 19:43:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 20:02:45 GMT]]></title><description><![CDATA[<p>och schrieb:</p>
<blockquote>
<p>Mit Konsistenz meine ich, dass diese using-Syntax auch für &quot;normale typedefs&quot; herhalten kann.</p>
</blockquote>
<p>Ja, das hab ich schon so verstanden. Nur finde ich es etwas idealistisch, wenn davon ausgegangen wird, dass mehr syntaktische Möglichkeiten für ein und die selbe Semantik ausschliesslich zu einheitlicherem Code führen.</p>
<p>Ich meine, bisher war doch alles recht verständlich. Initialisierungsbeispiel: Man nimmt <code>Type obj(args)</code> im allgemeinen Fall, <code>Type obj = arg;</code> für kompatible Typen, <code>Type obj = {args}</code> für Aggregate. Ich sehe keinen Anlass, diese Dinge gleich zu behandeln und dafür eine neue Schreibweise einzuführen. Noch dazu eine, die zwar viele Fälle vereinheitlicht, jedoch neue Inkonsistenzen mit sich bringt (siehe <code>std::vector</code> -Beispiel).</p>
<p>och schrieb:</p>
<blockquote>
<p>Von dem initializer_list-Kram bin ich auch nicht gerade begeistert. Ich sehe da bis heute noch keine Verwendung für -- außer in kleinen (IMHO) praxisfernen Code-Beispielen wie</p>
</blockquote>
<p>Ich finde <code>std::initializer_list</code> ein sehr interessantes Feature, nur die Vermischung mit Konstruktoraufrufen bereitet mir etwas Sorgen. Beispielsweise existiert auch diese Form:</p>
<pre><code class="language-cpp">return MyClass(47, &quot;hallo&quot;); // C++98

return {47, &quot;hallo&quot;}; // C++0x
</code></pre>
<p>Sicher keine schlechte Idee, gerade im Bezug auf Typinferenz mit <code>auto</code> und <code>decltype</code> . Aber warum die geschweiften Klammern? Ich hätte sowas schön gefunden:</p>
<pre><code class="language-cpp">return auto(47, &quot;hallo&quot;);
</code></pre>
<p>Zurück zu <code>std::initializer_list</code> : Solche hardcodierten Listen sind zwar wie du sagst selten anzutreffen, aber vielleicht ergeben sich plötzlich neue Anwendungsfälle. Ein spontaner Einfall:</p>
<pre><code class="language-cpp">// C++98
CallbackSystem sys(47);
sys.RegisterFunction(&amp;Func1);
sys.RegisterFunction(&amp;Func2);
sys.RegisterFunction(&amp;Func3);

// C++0x
CallbackSystem sys(47, {&amp;Func1, &amp;Func2, &amp;Func3})
</code></pre>
<p>Initialisierungslisten können ja nicht nur als Datentabellen benutzt werden. Gibt es nicht auch eine Verwendung in Zusammenhang mit Variadic Templates? Ich kenne mich diesbezüglich auch zu wenig aus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914120</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Jun 2010 20:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Warum using bei Template-Alias (C++0x)? on Thu, 17 Jun 2010 21:45:19 GMT]]></title><description><![CDATA[<p>Hm, also zusammengefasst, hätte man auch <code>typedef</code> nehmen können, es wiederspricht aber etwas der logik, da nicht wirklich ein neuer Typ definiert wird.<br />
Andererseits schreibe ich bei Template-Klassen vor das <code>class</code> einfach <code>template</code> und störe mich nicht, dass eigentlich keine Klasse definiert wird.<br />
Über Sinn uns Unsinn, dafür (für Template-Aliases) ein neues syntaktsiches Konstrukt einzuführen, lässt sich also streiten.</p>
<p>Gut, das eigentlich schon alles, was ich wissen wollte (wenn noch jemand einen guten Grudn für <code>using</code> hat, dann aber trotzdem immer her damit^^), ich danke allen für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914179</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Thu, 17 Jun 2010 21:45:19 GMT</pubDate></item></channel></rss>