Ich bin verblüfft (std-kopierkonstruktor/zuweisungsoperator)
-
Woran siehst du das der irgendwas wegcasten will? Der findet nur keinen passenden operator *=()
-
devil81 schrieb:
Welcher Kompiler dürfte wohl noch eine wichtige Frage sein...
Steht doch da...
-
Naja, aber erstens gibts den operator (die erste Version tut ja mehr oder weniger das gleiche), aber wie soll man das sonst deuten?
-
ness schrieb:
Naja, aber erstens gibts den operator (die erste Version tut ja mehr oder weniger das gleiche), aber wie soll man das sonst deuten?
Du hast nicht die ganze Fehlermeldung gepostet. Das ist schon mal verwerflich. Zum anderen kann es sein, dass das Problem daran liegt, dass temporäre Objekte nicht an nicht-konstante Parameter gebunden werden können.
-
Hm, hab jetzt noch mal in mehr effektiv c++ nachgeguckt, und da hab ich diese komische deklaration des += operators gesehen:
Rational& operator+=(const rational&)
Zu bemerken ist, dass das in der Klasse rational steht. Der operator+ ist dann so ähnlich definiert wie meiner.
Hm, theoretisch tritt hier der selbe Fehler auf, aber das ist dann kein Parameter... unlogisch, dass das erlaubt ist.
Danke erst mal an Walli, der mir (wieder mal) auf die Sprünge half.
-
ness schrieb:
Trotzdem arbeitet der kopierkonstuktor richtig!
Liegt das jetzt an der "nichtstandardkonformität" des gcc oder (wieder mal) an meinem nicht vorhandenem Verständnis für arrays (anstelle von Zeigern)?Das ist korrekt. Hinter C-Arrays steckt keine Logik. Wenn Arrays in einem struct oder einer Klasse stecken, sind sie auf einmal kopier- und zuweisbar.
-
const foo operator*(const foo& a,const foo& b) { foo c(a); return c*=b; };
als was anderes als
const foo operator*(const foo& a,const foo& b) { return foo (a)*=b; };
Also die 2. Variante ist so weit ich weiss einfach falsch. Überleg mal, was passiert: Du initialisierst ein foo mit a, und willst gleichzeitig den Operator = damit verwenden? Wäre so was wie int a(10)=2; Da wird jeder Compiler meckern!
Und selbst wenn Du nur schreibst:
[/cpp]const foo operator*(const foo& a,const foo& b) { return a*=b; };
kriegst Du 'nen Fehler, weil a ja const ist, und nicht verändert werden darf...
Beim ersten Beispiel ist die Situation anders: Dort initialisierst Du ein nicht konstantes foo c mit a. Die Operation c*=b ist also erlaubt!Oder hab' ich was nicht richtig verstanden???
Oder sollte es am Ende gar nicht *= heissen, sondern nur *? Dann wäre nämlich alles in Ordnung...
-
Nein, das ist richtig. Es geht dabei um returnwertoptimierung. An sich sind beide Funktionen äquivalent, mit dem untersched das die erste ein benanntes Objekt enthält, das schwerer wegoptimiert werden kann.
Das das mit ints nicht klappt ist egal, hier handelt es sich um selbst geschriebene Funktonen, amn darf alles (mehr oder weniger)! Die eigentliche Idee ist, den Kopierkonstruktor aufzurufden.
Mein Fehler war, operator+= außerhalb der Klasse zu definieren, der Trik an der Sache ist, dass nicht zu machen...
-
ness schrieb:
Es geht dabei um returnwertoptimierung.
Ich würde mal glatt behaupten, dass der Compiler in dem Fall schlau genug wäre diese "Optimierung" selber vorzunehmen.
-
Ja, desshalb schreibt man das ja, damit er das unbenannte Objekt wegoptimieren kann.
Laut dem neuesten Standard darf er glaubig auch benannte Objekte wegoptimieren....