<?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[Operator Überladung - Automatisch generieren lassen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte mal etwas bezüglich Operator-Überladung fragen. Und zwar angenommen ich habe eine kleine Mathe-Vektor Klasse so in dem Stil:</p>
<pre><code>template &lt;class T&gt;
class Vector3D
{
    /* Etwa 50 Zeilen Code */
};
</code></pre>
<p>Dann ist die Klasse ziemlich klein und schön übersichtlich, so wie ich mir das vorstelle.</p>
<p>Jetzt hätte ich aber gerne auch sämtliche Operatoren für diese Vektor Klasse überladen, damit man damit einfacher rechnen kann. Also überlade ich etwa den + operator (global) wie folgt:</p>
<pre><code>template &lt;typename T&gt;
Vector3D&lt;T&gt; operator+(Vector3D&lt;T&gt; const &amp;lhs, Vector3D&lt;T&gt; const &amp;rhs)
{
    // Hier wird die Addition ausgeführt
}
</code></pre>
<p>Problem: Damit kann ich jetzt nur etwas wie <code>my_vector1 = my_vector1 + my_vector2</code> . Schon sowas wie <code>my_vector1 += my_vector2</code> geht nicht mehr weil ich dafür erst den <code>+=</code> operator überladen muss, obwohl dieser ja eigentlich aus dem + Operator hergeleitet werden könnte.</p>
<p>Also muss ich manuell <code>+(binär), +(unär), +=, ++(prefix), ++(postfix)</code> überladen. Gleiches mit minus oder den Vergleichsoperatoren. Meine anfangs schön kleine Header Datei ist jetzt schon vollgestopft mit etlichen Funktionen, von denen die meisten sehr redundant sind.</p>
<p>Daher meine Frage: Warum generiert sich der Compiler diese Operatoren nicht selbst? Beispielsweise könnte man ja (in Sachen Addition) nur erlauben den + Operator zu überladen und der Compiler ersetzt dann etwas wie <code>v1 += v2</code> direkt mit <code>v1 = v1 + v2</code> . Wäre das nicht besser da weniger Arbeit, weniger Fehler und weniger &quot;Verwirrung&quot;, etwa wenn jemand den <code>+=</code> Operator anders überlädt als man es erwarten würde (also so dass <code>v1 += v2 != v1 = v1 + v2</code> )?</p>
<p>Und zweitens, gibt es vielleicht doch eine Möglichkeit sich die restlichen Operatoren aus den bisher bekannten automatisch generieren zu lassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328071/operator-überladung-automatisch-generieren-lassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 11:41:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328071.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Sep 2014 10:08:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 10:09:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte mal etwas bezüglich Operator-Überladung fragen. Und zwar angenommen ich habe eine kleine Mathe-Vektor Klasse so in dem Stil:</p>
<pre><code>template &lt;class T&gt;
class Vector3D
{
    /* Etwa 50 Zeilen Code */
};
</code></pre>
<p>Dann ist die Klasse ziemlich klein und schön übersichtlich, so wie ich mir das vorstelle.</p>
<p>Jetzt hätte ich aber gerne auch sämtliche Operatoren für diese Vektor Klasse überladen, damit man damit einfacher rechnen kann. Also überlade ich etwa den + operator (global) wie folgt:</p>
<pre><code>template &lt;typename T&gt;
Vector3D&lt;T&gt; operator+(Vector3D&lt;T&gt; const &amp;lhs, Vector3D&lt;T&gt; const &amp;rhs)
{
    // Hier wird die Addition ausgeführt
}
</code></pre>
<p>Problem: Damit kann ich jetzt nur etwas wie <code>my_vector1 = my_vector1 + my_vector2</code> . Schon sowas wie <code>my_vector1 += my_vector2</code> geht nicht mehr weil ich dafür erst den <code>+=</code> operator überladen muss, obwohl dieser ja eigentlich aus dem + Operator hergeleitet werden könnte.</p>
<p>Also muss ich manuell <code>+(binär), +(unär), +=, ++(prefix), ++(postfix)</code> überladen. Gleiches mit minus oder den Vergleichsoperatoren. Meine anfangs schön kleine Header Datei ist jetzt schon vollgestopft mit etlichen Funktionen, von denen die meisten sehr redundant sind.</p>
<p>Daher meine Frage: Warum generiert sich der Compiler diese Operatoren nicht selbst? Beispielsweise könnte man ja (in Sachen Addition) nur erlauben den + Operator zu überladen und der Compiler ersetzt dann etwas wie <code>v1 += v2</code> direkt mit <code>v1 = v1 + v2</code> . Wäre das nicht besser da weniger Arbeit, weniger Fehler und weniger &quot;Verwirrung&quot;, etwa wenn jemand den <code>+=</code> Operator anders überlädt als man es erwarten würde (also so dass <code>v1 += v2 != v1 = v1 + v2</code> )?</p>
<p>Und zweitens, gibt es vielleicht doch eine Möglichkeit sich die restlichen Operatoren aus den bisher bekannten automatisch generieren zu lassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418428</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 20 Sep 2014 10:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 10:29:51 GMT]]></title><description><![CDATA[<p>Zu 2: Schau dir <a href="http://www.boost.org/doc/libs/1_56_0/libs/utility/operators.htm" rel="nofollow">boost operators</a> an.</p>
<p>Zu 1: Ja, es wäre richtig cool wenn der Compiler Operatoren automatisch generieren lassen könnte. C++11 bietet sogar die Syntax dafür:</p>
<pre><code>bool operator==(const T &amp;a, const T &amp;b)
{
  ...
}

bool operator!=(const T &amp;a, const T &amp;b) = default;
// Compiler generiert:
{
  return !(a == b);
}
</code></pre>
<p>Das wäre schon cool.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418430</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 20 Sep 2014 10:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 11:04:18 GMT]]></title><description><![CDATA[<p>Das funktioniert mit CRTP und Friend name injection:</p>
<pre><code>template&lt;typename Derived&gt;
struct AddAssignableSym
{
	friend Derived&amp; operator+= (Derived&amp; Lhs, Derived const&amp; Rhs)
	{
		return Lhs = Lhs + Rhs;
	}
};
</code></pre>
<p>Normalerweise ist es aber umgekehrt performanter (also die Zuweisungsversion selbst zu schreiben und die andere generieren zu lassen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418433</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 20 Sep 2014 11:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 11:06:54 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<pre><code>bool operator!=(const T &amp;a, const T &amp;b) = default;
// Compiler generiert:
{
  return !(a == b);
}
</code></pre>
<p>Das wäre schon cool.</p>
</blockquote>
<p>Dann wohl eher:</p>
<pre><code>bool operator!=(const T &amp;a, const T &amp;b) = default;
// Compiler generiert:
{
  return !static_cast&lt;bool&gt;(a == b);
}

// oder meinetwegen:
bool operator!=(const T &amp;a, const T &amp;b) = default;
// &lt;=&gt;
auto operator!= (T const&amp; Lhs, T const&amp; Rhs) -&gt; decltype(!(Lhs == Rhs))
{
    return !(Lhs == Rhs);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2418435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418435</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Sat, 20 Sep 2014 11:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 11:28:25 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Zu 2: Schau dir <a href="http://www.boost.org/doc/libs/1_56_0/libs/utility/operators.htm" rel="nofollow">boost operators</a> an.</p>
</blockquote>
<p>Hm Ok, werd ich mir mal anschauen, danke. Wobei ich ja gerne auf boost verzichten würde (außerdem sieht das wieder sehr komplex aus für etwas eigentlich sehr simples...).</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Zu 1: Ja, es wäre richtig cool wenn der Compiler Operatoren automatisch generieren lassen könnte. C++11 bietet sogar die Syntax dafür:</p>
</blockquote>
<p>Das wäre wirklich schön, ist sowas für die Zukunft geplant?</p>
<p>asfdlol schrieb:</p>
<blockquote>
<p>Dann wohl eher:</p>
<pre><code>bool operator!=(const T &amp;a, const T &amp;b) = default;
// Compiler generiert:
{
  return !static_cast&lt;bool&gt;(a == b);
}

// oder meinetwegen:
bool operator!=(const T &amp;a, const T &amp;b) = default;
// &lt;=&gt;
auto operator!= (T const&amp; Lhs, T const&amp; Rhs) -&gt; decltype(!(Lhs == Rhs))
{
    return !(Lhs == Rhs);
}
</code></pre>
</blockquote>
<p>Wozu soll man hier noch den cast zu <code>bool</code> brauchen? <code>(a == b)</code> gibt doch schon ein <code>bool</code> zurück, wozu soll das dann nochmal gecastet werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418437</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 20 Sep 2014 11:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 11:51:38 GMT]]></title><description><![CDATA[<p><a href="http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp" rel="nofollow">http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418438</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 20 Sep 2014 11:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 12:11:02 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p><a href="http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp" rel="nofollow">http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp</a></p>
</blockquote>
<p>Ich hab einfach nur operator== als Beispiel genommen, weil ich keine Lust hab, mir die effizienteste Implementierung von operator+ mithilfe von operator+= zu überlegen und aufzuschreiben...<br />
Natürlich gibt es rel_ops, aber genauso wie boost.operators ist das nicht ganz dasgleiche wie ein language feature.</p>
<p>@asdflol:<br />
Man braucht kein Cast oder decltype. Die = default Variante erwartet, dass eine Funktion mit derselben Signatur existiert, ansonsten ist das ein Fehler. Templates zählen auch nicht, das würde evtl. zu ungewollten Effekten führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418439</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 20 Sep 2014 12:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sat, 20 Sep 2014 12:18:37 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p><a href="http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp" rel="nofollow">http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp</a></p>
</blockquote>
<p>rel_ops ist ein komplettes Fehldesign, besser nicht verwenden.</p>
<p>Boost hat den besseren Ansatz, man kann ihn auch leicht selber nachprogrammieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418440</guid><dc:creator><![CDATA[big_flops]]></dc:creator><pubDate>Sat, 20 Sep 2014 12:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sun, 21 Sep 2014 19:28:09 GMT]]></title><description><![CDATA[<p>big_flops schrieb:</p>
<blockquote>
<p>rel_ops ist ein komplettes Fehldesign, besser nicht verwenden.</p>
</blockquote>
<p>Hm, warum denn? Was können für Probleme mit der Verwendung von <code>rel_ops</code> auftreten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418577</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 21 Sep 2014 19:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Sun, 21 Sep 2014 23:34:32 GMT]]></title><description><![CDATA[<p>Da es sich um Templates handelt, werden die Operatoren für viel mehr Überladungen herangezogen, als du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418587</guid><dc:creator><![CDATA[spoler]]></dc:creator><pubDate>Sun, 21 Sep 2014 23:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 06:42:58 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Wozu soll man hier noch den cast zu <code>bool</code> brauchen? <code>(a == b)</code> gibt doch schon ein <code>bool</code> zurück, wozu soll das dann nochmal gecastet werden?</p>
</blockquote>
<p>Wenn man so etwas als Sprachfeature anbietet, dann soll es so allgemein wie möglich sein. Der <code>!</code> -Operator ist überladbar und der <code>==</code> -Operator muss nicht notwendigerweise <code>bool</code> zurückgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418594</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 22 Sep 2014 06:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 08:42:32 GMT]]></title><description><![CDATA[<p>spoler schrieb:</p>
<blockquote>
<p>Da es sich um Templates handelt, werden die Operatoren für viel mehr Überladungen herangezogen, als du willst.</p>
</blockquote>
<p>Welche sind das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418610</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 22 Sep 2014 08:42:32 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 11:56:34 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Wenn man so etwas als Sprachfeature anbietet, dann soll es so allgemein wie möglich sein. Der <code>!</code> -Operator ist überladbar und der <code>==</code> -Operator muss nicht notwendigerweise <code>bool</code> zurückgeben.</p>
</blockquote>
<p>Versteh ich nicht. Der <code>!</code> -Operator ist überladbar, ja, aber doch nicht bezüglich des Rückgabewertes? Also wenn ich schreibe:</p>
<pre><code>bool operator==(MyClass const &amp;lhs, MyClass const &amp;rhs)
{
    return lhs.value == rhs.value; // Irgendwas
}

bool operator!=(MyClass const &amp;lhs, MyClass const &amp;rhs)
{
    return !(lhs == rhs);
}
</code></pre>
<p>dann ist die Signatur für MyClass ja schon &quot;blockiert&quot;. Also ich kann dann eh keinen Overload für den <code>!=Operator</code> schreiben, der zwei MyClass Typen als Argument nimmt.</p>
<p>Und wenn der <code>==operator</code> tasächlich <em>nicht</em> ein <code>bool</code> zurückgibt (was ich aber schon ziemlich fragwürdig finden würde), warum sollte dann der daraus default-hergeleitete <code>!=operator</code> trotzdem (per erzwungenem cast) <code>bool</code> zurückgeben und nicht das selbe wie derjenige <code>==operator</code> der für die default Herleitung hinzugezogen wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418650</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 22 Sep 2014 11:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 12:03:32 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Versteh ich nicht. Der <code>!</code> -Operator ist überladbar, ja, aber doch nicht bezüglich des Rückgabewertes?</p>
</blockquote>
<p>Doch?</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Also wenn ich schreibe: [...] dann ist die Signatur für MyClass ja schon &quot;blockiert&quot;. Also ich kann dann eh keinen Overload für den <code>!=Operator</code> schreiben, der zwei MyClass Typen als Argument nimmt.</p>
</blockquote>
<p>Richtig, und weiter?</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Und wenn der <code>==operator</code> tasächlich <em>nicht</em> ein <code>bool</code> zurückgibt (was ich aber schon ziemlich fragwürdig finden würde), warum sollte dann der daraus default-hergeleitete <code>!=operator</code> trotzdem (per erzwungenem cast) <code>bool</code> zurückgeben und nicht das selbe wie derjenige <code>==operator</code> der für die default Herleitung hinzugezogen wurde?</p>
</blockquote>
<p>Weil der für den Rückgabewert vom <code>==</code> -Operator überladene <code>!</code> -Operator möglicherweise semantisch etwas Anderes ausdrückt als der <code>!</code> -Operator bei <code>bool</code> s.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418652</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 22 Sep 2014 12:03:32 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 12:06:39 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Und wenn der <code>==operator</code> tasächlich <em>nicht</em> ein <code>bool</code> zurückgibt (was ich aber schon ziemlich fragwürdig finden würde), warum sollte dann der daraus default-hergeleitete <code>!=operator</code> trotzdem (per erzwungenem cast) <code>bool</code> zurückgeben und nicht das selbe wie derjenige <code>==operator</code> der für die default Herleitung hinzugezogen wurde?</p>
</blockquote>
<p>Nehmen wir einfach mal das hier an:</p>
<pre><code>[code=&quot;cpp&quot;]
int operator==(MyClass const &amp;lhs, MyClass const &amp;rhs)
{
    return lhs.value - rhs.value;
}

auto operator!=(MyClass const &amp;lhs, MyClass const &amp;rhs) = default;
</code></pre>
<p>Was sollte der !=-Operator dann zurückgeben? Einen &quot;Nicht&quot;-Int? Oder -(lhs == rhs)? (Was ist in dem Fall mit Vorzeichenlosen Typen?)<br />
Oder soll tätlich ein boolscher Cast per ! vorgenommen werden?</p>
<p>Das klingt halt alles sehr willkürlich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418653</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 22 Sep 2014 12:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 12:19:18 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Nehmen wir einfach mal das hier an:</p>
<pre><code>int operator==(MyClass const &amp;lhs, MyClass const &amp;rhs)
{
    return lhs.value - rhs.value;
}

auto operator!=(MyClass const &amp;lhs, MyClass const &amp;rhs) = default;
</code></pre>
<p>Was sollte der !=-Operator dann zurückgeben? Einen &quot;Nicht&quot;-Int? Oder -(lhs == rhs)? (Was ist in dem Fall mit Vorzeichenlosen Typen?)<br />
Oder soll tätlich ein boolscher Cast per ! vorgenommen werden?</p>
<p>Das klingt halt alles sehr willkürlich...</p>
</blockquote>
<p>Welchen Sinn sollte ein operator== haben, der einen int liefert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418657</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 22 Sep 2014 12:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 12:23:49 GMT]]></title><description><![CDATA[<p>Imho ein großer Fehler von C++ solch unsinnige Operatorenüberladungen zu erlauben. Erlaubt zwar Spielereien wie Boot.Spirit - aber ist sehr schlechter Stil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418660</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 22 Sep 2014 12:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 12:34:13 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>happystudent schrieb:</p>
<blockquote>
<p>Versteh ich nicht. Der <code>!</code> -Operator ist überladbar, ja, aber doch nicht bezüglich des Rückgabewertes?</p>
</blockquote>
<p>Doch?</p>
</blockquote>
<p>Ok, ich dachte du meintest mehrfach überladbar, Missverständnis.</p>
<p>asfdlol schrieb:</p>
<blockquote>
<p>Weil der für den Rückgabewert vom <code>==</code> -Operator überladene <code>!</code> -Operator möglicherweise semantisch etwas Anderes ausdrückt als der <code>!</code> -Operator bei <code>bool</code> s.</p>
</blockquote>
<p>Ja schon, aber dann wärs doch besser eine Warnung zu generieren als das durch einen cast zu verschleiern oder? Halt in etwa wie wenn ich schreibe:</p>
<pre><code>bool b = 2; // warning C4305: 'initializing' : truncation from 'int' to 'bool'
</code></pre>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Nehmen wir einfach mal das hier an:</p>
<pre><code>[code=&quot;cpp&quot;]
int operator==(MyClass const &amp;lhs, MyClass const &amp;rhs)
{
    return lhs.value - rhs.value;
}

auto operator!=(MyClass const &amp;lhs, MyClass const &amp;rhs) = default;
</code></pre>
<p>Was sollte der !=-Operator dann zurückgeben? Einen &quot;Nicht&quot;-Int? Oder -(lhs == rhs)? (Was ist in dem Fall mit Vorzeichenlosen Typen?)<br />
Oder soll tätlich ein boolscher Cast per ! vorgenommen werden?</p>
<p>Das klingt halt alles sehr willkürlich...</p>
</blockquote>
<p>Hier würde ich eben wie oben beschrieben eine Warnung ausgeben. Wenn der Compiler einfach aus dem <code>operator==</code> einen <code>operator!=</code> mittels <code>!(lhs == rhs)</code> generiert dann ist doch alles eindeutig und nicht willkürlich.</p>
<p>Wenn man wirklich so exotische Überladungen für diese Operatoren braucht (wie etwa einen int als Rückgabetyp) dann kann (bzw. muss) man sie halt immer noch explizit hinschreiben. Dann kann man sich aber auch nicht drüber beschweren, von daher seh ich das Problem nicht.</p>
<p>In 99,9% der Fälle will man je eh einen bool als Rückgabetyp. Und in den paar Asnahmefällen schreibt man die entsprechenden Operatoren halt explizit hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418661</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 22 Sep 2014 12:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 14:24:51 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Imho ein großer Fehler von C++ solch unsinnige Operatorenüberladungen zu erlauben. Erlaubt zwar Spielereien wie Boot.Spirit - aber ist sehr schlechter Stil.</p>
</blockquote>
<p>rofl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418675</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 22 Sep 2014 14:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 14:34:45 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Imho ein großer Fehler von C++ solch unsinnige Operatorenüberladungen zu erlauben. Erlaubt zwar Spielereien wie Boot.Spirit - aber ist sehr schlechter Stil.</p>
</blockquote>
<p>rofl</p>
</blockquote>
<p>Ja weil</p>
<pre><code>std::string s2;
std::getline(std::cin, s2);

std::string s1 = &quot;Hallo&quot;;
s1.append(&quot; &quot;);
s1.append(s2);

std::cout.write(s1).endl();
</code></pre>
<p>auch so geil und viel kürzer ist.</p>
<p>Oder hättest gerne sowas wie in Java, wo keine Operatorenüberladung exitiert, außer bei dem im Sprachkern festgenagelten java.lang.String (was ja wohl eine blöde Ausnahme darstellt)??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418679</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 22 Sep 2014 14:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 14:38:51 GMT]]></title><description><![CDATA[<p>Hey, ich stimme dir sogar zu, dass die Iostream Operatoren scheisse sind.<br />
Und trotzdem ist Operator Ueberladung gut so wie sie ist. Fehlen nur noch benutzerdefinierte Operatoren wie in Swift, das waere geil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418681</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 22 Sep 2014 14:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 14:43:45 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Hey, ich stimme dir sogar zu, dass die Iostream Operatoren scheisse sind.</p>
</blockquote>
<p>Erklär mal...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418683</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 22 Sep 2014 14:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 14:52:13 GMT]]></title><description><![CDATA[<p>Ich finde Operatoren-Überladung in D ganz gut: <a href="http://dlang.org/operatoroverloading.html" rel="nofollow">http://dlang.org/operatoroverloading.html</a></p>
<p>Irgendwo in der Mitte zwischen künstlerischer Freiheit und logischer Semantik.<br />
Zb. implementiert man die Operatoren &lt;, &lt;=, &gt;, &gt;= indem man eine einzige, strcmp-ähnliche Funktion implementiert - super. <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>Das schlimmste ist dass wenn C++-Operatoren sich anders als erwartet verhalten (warum kann ein Multiplikationsoperator nochmal eine Datenbankverbindung zurückgeben und eine Seite auf dem Drucker ausdrucken ?) man sie auch noch schwer findet - oder kapieren IDEs heutzutage bei der Verwendung eines Operators dass das ein überladener Operator ist und führen einen direkt zur Dekleration?</p>
<p>---</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Imho ein großer Fehler von C++ solch unsinnige Operatorenüberladungen zu erlauben. Erlaubt zwar Spielereien wie Boot.Spirit - aber ist sehr schlechter Stil.</p>
</blockquote>
<p>rofl</p>
</blockquote>
<p>Ja weil</p>
<pre><code>std::string s2;
std::getline(std::cin, s2);

std::string s1 = &quot;Hallo&quot;;
s1.append(&quot; &quot;);
s1.append(s2);

std::cout.write(s1).endl();
</code></pre>
<p>auch so geil und viel kürzer ist.</p>
<p>Oder hättest gerne sowas wie in Java, wo keine Operatorenüberladung exitiert, außer bei dem im Sprachkern festgenagelten java.lang.String (was ja wohl eine blöde Ausnahme darstellt)??</p>
</blockquote>
<p>Fände es so schöner:</p>
<pre><code>cout.writeln(&quot;Hallo &quot;, cin.getln());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2418686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418686</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 22 Sep 2014 14:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 15:05:13 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Hey, ich stimme dir sogar zu, dass die Iostream Operatoren scheisse sind.</p>
</blockquote>
<p>Erklär mal...</p>
</blockquote>
<p>Noe.</p>
<p>Ethon schrieb:</p>
<blockquote>
<p>Ich finde Operatoren-Überladung in D ganz gut: <a href="http://dlang.org/operatoroverloading.html" rel="nofollow">http://dlang.org/operatoroverloading.html</a></p>
<p>Irgendwo in der Mitte zwischen künstlerischer Freiheit und logischer Semantik.<br />
Zb. implementiert man die Operatoren &lt;, &lt;=, &gt;, &gt;= indem man eine einzige, strcmp-ähnliche Funktion implementiert - super. <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>Das schlimmste ist dass wenn C++-Operatoren sich anders als erwartet verhalten (warum kann ein Multiplikationsoperator nochmal eine Datenbankverbindung zurückgeben und eine Seite auf dem Drucker ausdrucken ?) man sie auch noch schwer findet - oder kapieren IDEs heutzutage bei der Verwendung eines Operators dass das ein überladener Operator ist und führen einen direkt zur Dekleration?</p>
</blockquote>
<p>Naeh, die strcmp Semantik ist n grosser grosser Fehler. Macht alle Operatoren unnoetig langsam aufgrund Funktionalitaet die nicht gebraucht wird. Das passt in C++ schon so. Und in C++17 (oder schon 14 (?)) kriegen wir die sogar mit = default.</p>
<p>Am schlimmsten ist opEquals als member. Hat man gar nichts von Java gelernt? Buh...</p>
<p>Ethon schrieb:</p>
<blockquote>
<p>Fände es so schöner:</p>
<pre><code>cout.writeln(&quot;Hallo &quot;, cin.getln());
</code></pre>
</blockquote>
<p>Naeh. Das sollten schon freie Funktionen sein, und dann sollte es natuerlich readln heissen wenn schon. Aber freie Funktionen mit Membersyntax aufrufen finde ich auch geil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418687</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 22 Sep 2014 15:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 15:10:13 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Naeh, die strcmp Semantik ist n grosser grosser Fehler. Macht alle Operatoren unnoetig langsam aufgrund Funktionalitaet die nicht gebraucht wird. Das passt in C++ schon so. Und in C++17 (oder schon 14 (?)) kriegen wir die sogar mit = default.</p>
<p>Am schlimmsten ist opEquals als member. Hat man gar nichts von Java gelernt? Buh...</p>
</blockquote>
<p>Ich denke mal dass da recht viel optimiert werden kann da der Compiler ja ungefähr versteht was die Funktion macht.</p>
<p>Dass opEquals eine Memberfunktion ist wird vermutlich darin begründet sein dass da unkomplizierter bei Klassen (die ja Referenztypen sind) und Polymorphie funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418692</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 22 Sep 2014 15:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Überladung - Automatisch generieren lassen? on Mon, 22 Sep 2014 15:13:25 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Ich denke mal dass da recht viel optimiert werden kann da der Compiler ja ungefähr versteht was die Funktion macht.</p>
</blockquote>
<p>Vielleicht. Vielleicht auch nicht.</p>
<p>Ethon schrieb:</p>
<blockquote>
<p>Dass opEquals eine Memberfunktion ist wird vermutlich darin begründet sein dass da unkomplizierter bei Klassen (die ja Referenztypen sind) und Polymorphie funktioniert.</p>
</blockquote>
<p>Man will keine Objekte mit (potentiell) unterschiedlichem Typ vergleichen. Das macht mal gar keinen Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2418693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2418693</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 22 Sep 2014 15:13:25 GMT</pubDate></item></channel></rss>