2013-05-20 6 views
32

Wenn ich ein benutzerdefinierte operator+() wie in:Fehler benutzerdefinierten Operator + auf temporäres Objekt aufgerufen wird, wenn es zusätzliche Klammern

class A 
    { 
    public: 
     A operator+(A) 
     { 
      return A(); 
     } 
    }; 

Dann folgenden Werken wie erwartet:

A a = A() + A(); 

aber g ++ - 4.7 gibt folgende Fehlermeldung aus:

A a = (A()) + A(); 

Die Fehlermeldung ist insbesondere error: no match for ‘operator+’ in ‘+A()’.
Es sieht so aus, als ob der (A()) im Ausdruck ignoriert wird.

Meine Frage ist: ist A a = (A()) + A(); soll kompilieren und wenn nicht, warum nicht?

Hinweis: Dies passierte mir, als ich #define X (Identity()) tat und dann versuchte, X + X zu tun.

+0

Interessant. Wenn Sie es nicht wussten, wird es als der unäre Plusoperator behandelt, z. B. +5. – chris

+0

@chris Nun, da Sie es erwähnen, tritt der Fehler nicht auf, wenn Sie das Beispiel in den Divisionsoperator ändern, sondern für die Additions-, Subtraktions- und Multiplikationsoperatoren. Klingt so, als würde man in diesem Fall die unären Operatoren statt der binären analysieren. – SirGuy

Antwort

46

Es ist eine Cast-Syntax.

Der Grund dafür ist, dass Casting und die unäre Addition, Subtraktion und Multiplikation (der Dereferenzierungsoperator) höhere Priorität haben als ihre binären Gegenstücke. Da die weißen Räume hier nicht diese auch als gelesen werden kann Materie:

A a = (A()) +A(); 

Die Besetzung und unary+ höhere Priorität haben als die binären operator+ so der Ausdruck die frühere Bedeutung nimmt.

Sie wundern sich vielleicht (wie ich), wie Sie werfen können, wenn das Ding im Inneren kein Typ ist. Geben Sie THE MOST VEXING PARSE! ein, was bedeutet, dass ich versuche, ein Objekt vom Typ +A() zu einer Funktion zu werfen, die 0 Argumente nimmt und ein Objekt vom Typ A zurückgibt.

Für die Aufzeichnung der Syntax:

A a = ((A())) + A(); 

gibt, was Sie wollen, da die doppelten eckigen Klammern nicht gegossen werden können und wir sind wieder den binären operator+ Ausdruck zu parsen.

Dies erklärt auch, warum das Problem mit dem Division Operator statt der Addition nicht auftritt, es hat kein unäres Gegenstück.

+8

Das verdient mehr Stimmen, ehrlich gesagt. – chris